分类 网站后端 下的文章

通过在.Net Core应用中运行Python脚本,可以非常方便的进行某些功能的处理。特别是考虑到Python是解释型语言,不需要像.Net 那样编译再部署。

通过使用NuGet中的IronPythonIronPython.StdLib:

public class PythonScript
{
    private ScriptEngine _engine;

    public PythonScript()
    {
        _engine = Python.CreateEngine();
    }

    public TResult RunFromString<TResult>(string code, string variableName)
    {
        // for easier debugging write it out to a file and call: _engine.CreateScriptSourceFromFile(filePath);
        ScriptSource source = _engine.CreateScriptSourceFromString(code, SourceCodeKind.Statements);
        CompiledCode cc = source.Compile();

        ScriptScope scope = _engine.CreateScope();
        cc.Execute(scope);

        return scope.GetVariable<TResult>(variableName);
    }
}

然后使用运行脚本:

var py = new PythonScript();
var result = py.RunFromString<int>("d = 8", "d");
Console.WriteLine(result);

原生的ProcessProcessStartInfo (个人实践出来的)

注意,需要通过执行含有Python可执行文件和参数的shell脚本来实现执行Python脚本, 有点绕,具体就是:

1, 创建一个run.batWindows系统:

C:\YOUR_PYTHON_PATH\python.exe %*

2, 创建一个run.sh文件给LInux系统:

#!/bin/bash
/usr/bin/python3 "[email protected]"

3, 使用Process and ProcessStartInfo 来运行脚本:

string fileName = null;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
    fileName = "path_to_bat/run.bat"
}
else
{
    fileName = "path_to_bat/run.sh"
}

ProcessStartInfo start = new ProcessStartInfo
{
    FileName = fileName,
    Arguments = string.Format("\"{0}\" \"{1}\"", script, args),
    UseShellExecute = false,
    CreateNoWindow = true,
    RedirectStandardOutput = true,
    RedirectStandardError = true
};
using Process process = Process.Start(start);

变量script指代需要执行的Python脚本所在位置,变量args指代脚本需要的参数,若有多个参数,酌情修改程序片段。

参考

  1. How to use Python in .NET-Core application?
  2. How to run python script from C# code by using command

有时候我们需要在Salesforce页面下载存放为Attachment的文件;或者我们需要把存成Attachment的图片显示在页面上。

内部站点

如果我们文件为Attachment,在Salesforce Internal (即使用Salesforce账户登录的,非Digital Experience, Site.com),则可以使用

 <a href="{!URLFOR($Action.Attachment.Download, attachmentId)}">File Name</a>

下载文件。

或者使用

<img src="{!URLFOR($Action.Attachment.Download, attachmentId)}" />

显示图片。

如果是File,则可以使用Url.getFileFieldURL(entityId, fieldName)

Site.com

Site.com上的则不能用上面的方法,使用的话会直接报错。这时可以通过Salesforce提供的文件下载api /servlet/servlet.FileDownload?file=xxxx~18,不过要注意,一定要使用Salesorce Internal Url,使用Site.com的相关url肯定也会报错。

  1. 首先在后台获取 Salesforce Instance Url 或 Org Domain Url。例如:
    String orgUrl = Url.getOrgDomainUrl().toExternalForm()
  2. 将其传到前台,拼接成下载地址:
    <a href="{!orgUrl + '/servlet/servlet.FileDownload?file=' + attachment.Id}">File Name</a>

参考文档

  1. Visualforce Developer Guide: $Action
  2. Apex Reference Guide: URLClass
  3. stackexchange: How to get salesforce instance url
  4. Salesforce Developer Forum: Download Attachment from Sites??
  5. Salesforce Developer Forum: How to get downloadable link for attachment?

升级后打开前后端均显示503,查询nginx日志显示:

PHP message: Adapter Typecho_Db_Adapter_Mysql is not available

由于之前升级过PHP,因此估计是PHP的问题。修改Typecho的config.inc.php相关代码为:

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'typecho_');

恢复正常。

前言

Discuz!X3.2这个问题不是个案,而是实实在在的bug,网上一搜一大把。但是目前仍然没有官方补丁出来,只有网友力量:

bug描述

在找回页码界面,填写并提交新密码后会出现「参数错误」的提示。

bug原因

discuz在post表单传值的时候没有没有传sign值,但是又校验的了这个sign值。为了安全起见,解决办法不能删除校验这步,必须传送这个sign值。

解决方法

  1. 修改文件:sourcemodulemembermember_getpasswd.php
$uid = $_GET['uid'];

下方添加

$sign = $_GET['sign'];
  1. 修改文件:templatedefaultmembergetpasswd.htm
    修改
<form method="post" autocomplete="off" action="member.php?mod=getpasswd&uid=$uid&id=$hashid">

<form method="post" autocomplete="off" action="member.php?mod=getpasswd&uid=$uid&id=$hashid&sign=$sign">

带出的问题

  1. 登录太慢,花时间太久

Discuz! 是非常知名的论坛和门户建站平台。但是其对电子邮箱有32位的限制,任何超过32位的邮箱都会被判断为无效邮箱。但是,实际上现在会有一些邮箱会超过这一限制,因此本着对所有用户负责人的态度,解除这一限制就成了当务之急。

经过粗略的研究Discuz!的form有效性验证是form内容提交到网站后,后台(php语言部分)进行验证,再将结果通过Ajax(注册时采用)或者召唤相应页面(注册后手动修改邮箱时采用)的方式返回到网页前端。同时,通过对3.2版本的Discuz!数据库研究发现,其默认的邮箱字段长度位255为可变字符(varchar)。因此,只要我们修改后台相应的php验证模块,我们可以实现最长255位的邮箱支持。不过实际上很难有人注册这种邮箱,我们的目标是为正常人类服务,因此将邮箱长度设置为64位.下面是步骤,就两步:

  1. 修改注册流程的后台php验证代码:

    **修改\discuz\source\function\function_core.php第370行函数「isemail」中最大长度32为64**
  2. 修改手动修改邮箱流程的后台php验证代码:

    **修改\discuz\source\function\function_member.php第285行函数「checkemail($email)」中「strlen($email) > 32」为「strlen($email) > 64」.**