Заговор на iis с флягой и wfastcgi
Я настроил IIS с помощью python и wfastcgi.py, в основном это работает. При попытке выполнить простые действия возвращает ожидаемое содержимое.
Моя проблема сейчас заключается в том, чтобы получить флягу и plotly/dash, работающие под IIS, с использованием атрибутов маршрутизации.
Мой web.config выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python36\python.exe|C:\Python36\Scripts\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
</handlers>
</system.webServer>
<appSettings>
<!-- Required settings -->
<add key="WSGI_HANDLER" value="index.wsgi_app" />
<add key="PYTHONPATH" value="C:/inetpub/wwwroot/python/venv/Scripts/python36.zip;C:/inetpub/wwwroot/python/venv/DLLs;C:/inetpub/wwwroot/python/venv/lib;C:/inetpub/wwwroot/python/venv/Scripts;c:/python36/Lib', 'c:/python36/DLLs;C:/inetpub/wwwroot/python/venv;C:/inetpub/wwwroot/python/venv/lib/site-packages" />
<!-- Optional settings -->
<add key="WSGI_LOG" value="C:\temp\my_app.log" />
<add key="WSGI_RESTART_FILE_REGEX" value=".*((\.py)|(\.config))$" />
<add key="APPINSIGHTS_INSTRUMENTATIONKEY" value="__instrumentation_key__" />
<add key="WSGI_PTVSD_SECRET" value="__secret_code__" />
<add key="WSGI_PTVSD_ADDRESS" value="ipaddress:port" />
</appSettings>
</configuration>
Я создал файл index.py и когда я использую
from flask import Flask
from SimpleDash1 import app as sd1
from WebAppExampleA import app as waea
app = Flask(__name__)
@app.route("/")
def hello():
response = ["Hello, world!\n"]
return (line.encode("utf-8") for line in response)
def wsgi_app(environ,start_response):
start_response('200 OK', [('Content-type', 'text/html'), ('Content-encoding', 'utf-8')])
return hello()
if __name__ == "__main__":
app.run()
Он отлично работает, но не совсем подходит для моего сюжета. Чтобы попытаться загрузить мое приложение, я использовал это вместо этого:
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html
from app import app
from apps import web_example_a
app.layout = html.Div([
dcc.Location(id='url', refresh=False),
html.Div(id='page-content')
])
@app.callback(Output('page-content', 'children'),
[Input('url', 'pathname')])
def display_page(pathname):
if pathname == '/apps/web_example_a':
return web_example_a.layout
#elif pathname == '/apps/app2':
# return app2.layout
else:
return '404'
if __name__ == '__main__':
app.run_server(debug=True)
Но теперь я озадачен тем, какую точку входа мне нужно настроить как мой WSGI_HANDLER в web.config. Если я пытаюсь изменить WSGI_HANDLER на "index.display_page", я получаю сообщение об ошибке:
Произошла ошибка:
Трассировка (последний вызов был последним): файл "C: \ Python36 \ Scripts \ wfastcgi.py", строка 849, в основном для части в результате: файл "C:\python36\lib\site-packages\applicationinsights\ запросы \WSGIApplication.py", строка 70, вызов для части в self._wsgi_application(environment, status_interceptor): файл"C:\python36\lib\site-packages\dash\dash.py", строка 498, в add_context output_value = func(*args, **kwargs) TypeError: display_page() принимает 1 позиционный аргумент, но 2 были заданы
STDOUT:
StdErr: C: \ python36 \ lib \ site-packages \ plotly \ tools.py: 103: Предупреждение пользователя:
Похоже, у вас нет прав на чтение и запись для вашего домашнего каталога ('~') или нашего каталога ~/.plotly. Это означает, что python api plotly не может устанавливать локальные файлы конфигурации. Нет проблем, хотя! Вам просто нужно войти в систему с помощью plotly.plotly.sign_in(). Для справки: 'help(plotly.plotly.sign_in)'. Вопросы? Посетите https://support.plot.ly/
1 ответ
Точкой входа WSGI для приложений Dash является экземпляр Flask, присоединенный к экземпляру Dash. Это означает, что вы хотите указать свой обработчик WSGI на app.server
(где app
это экземпляр Dash).
Серверы WSGI часто ищут атрибут application
когда передан модуль в качестве точки входа. Так что обычная вещь, которую нужно сделать, это создать файл точки входа. wsgi.py
который в вашем случае будет просто иметь это:
from index import app
application = app.server