Как изменить Модуль PSini другим способом для чтения файла в PowerShell?

Вы должны заметить, что APPLICATION_ROOT для этой цели НЕ.

Все, что вам нужно сделать, это написать промежуточное программное обеспечение для внесения следующих изменений:

  1. измените PATH_INFO, чтобы обработать префикс url.
  2. изменить SCRIPT_NAME, чтобы сгенерировать префиксный URL.

Как это:

class PrefixMiddleware(object):

    def __init__(self, app, prefix=''):
        self.app = app
        self.prefix = prefix

    def __call__(self, environ, start_response):

        if environ['PATH_INFO'].startswith(self.prefix):
            environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
            environ['SCRIPT_NAME'] = self.prefix
            return self.app(environ, start_response)
        else:
            start_response('404', [('Content-Type', 'text/plain')])
            return ["This url does not belong to the app.".encode()]

Оберните свое приложение с помощью промежуточного программного обеспечения, например:

from flask import Flask, url_for

app = Flask(__name__)
app.debug = True
app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/foo')


@app.route('/bar')
def bar():
    return "The URL for this page is {}".format(url_for('bar'))


if __name__ == '__main__':
    app.run('0.0.0.0', 9010)

Посетите http://localhost:9010/foo/bar,

Вы получите правильный результат: The URL for this page is /foo/bar

И не забудьте установить домен cookie, если вам нужно.

Это решение задано gist Larivact. APPLICATION_ROOT не для этой работы, хотя похоже, что это так. Это действительно запутанно.

0
задан Job 31 March 2019 в 02:38
поделиться

1 ответ

Есть способ использовать WindowsAPI.

$src = @"
[DllImport("KERNEL32.DLL")]
public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, System.Text.StringBuilder lpReturnedString, uint nSize, string lpFileName);
[DllImport("KERNEL32.DLL")]
public static extern uint WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
"@

Add-Type -MemberDefinition $src -Namespace WinApi -Name IniFileIO -Language CSharp

Function Read-IniFile ($Path, $Section, $Key) {
    $sb = [Text.StringBuilder]::new(1024)
    [WinApi.IniFileIO]::GetPrivateProfileString($Section, $Key, $null, $sb, $sb.Capacity, (Convert-Path -LiteralPath $Path)) > $null
    $sb.ToString()
}

Function Write-IniFile ($Path, $Section, $Key, $Value) {
    [WinApi.IniFileIO]::WritePrivateProfileString($Section, $Key, $Value, (Convert-Path -LiteralPath $Path)) >$null
}

Использование заключается в следующем.

Read-IniFile -Path "C:\sample.ini" -Section "Section1" -Key "Key1"
Write-IniFile -Path "C:\sample.ini" -Section "Section2" -Key "Key2" -Value "Hello"

Это случайный код, поэтому лучше использовать код, написанный mklement0 для фактического использования. Это более надежно.

0
ответ дан rokumaru 31 March 2019 в 02:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: