我正在尝试安装并启动一个简单的CherryPy服务器作为Windows服务.
这是脚本:(删除了一些行来缩短它.当从命令行手动执行时它完全正常工作)
app = AdminMediaHandler(django.core.handlers.wsgi.WSGIHandler())
logged_app = TransLogger(app)
server = wsgiserver.CherryPyWSGIServer( ('127.0.0.1', 8632), logged_app, server_name='localhost', numthreads=20 )
try:
server.start()
except KeyboardInterrupt:
server.stop()
Run Code Online (Sandbox Code Playgroud)
我正在使用sc.exe安装和启动服务.安装顺利,但我似乎无法启动该服务.
使用的命令是:(注意路径中有空格,虽然我用双引号处理它,并且在binPath通过命令行手动执行其字符串时正在工作)
> sc.exe create "ServiceName" binPath= "\"C:\Path to Python\python.exe\" \"C:\Path to CherryPy Script\cherryserver.py\""
> sc.exe start "ServiceName"
Run Code Online (Sandbox Code Playgroud)
无论是尝试使用GUI sc.exe还是通过services.mscGUI 启动服务,我都会收到此错误:
[SC] StartService FAILED 1053:
The service did not respond to the start or control request in a timely fashion.
Run Code Online (Sandbox Code Playgroud)
据我所知,这是因为python.exe没有实现Windows服务API.
我不希望.exe使用py2exe从脚本创建一个.
我发现 …
前言:我想把这些问题分成小问题,但显然,我错过了一些难题,对我来说似乎不可能.
我使用cherrypy内置的WSGI服务器开发了我的樱桃应用程序.我天真地假设,到时候,我将能够使用创建的WSGI Application类并使用任何符合WSGI的服务器进行部署.
我使用这篇博文来创建我自己的(但非常相似)的cherrypy插件和工具,以便在http请求期间使用SQLAlchemy连接到数据库.
我希望任何服务器都能像Cherrypy的内置服务器一样工作:
此流程与uWSGI不匹配(只要我理解).
我application.py在uWSGI配置中分配了我的.这个文件看起来像这样:
cherrypy.tools.db = DbConnectorTool()
cherrypy.engine.dbengine = DbEnginePlugin(cherrypy.engine, settings.database)
cherrypy.config.update({
'engine.dbengine.on': True
})
from myapp.application import Application
root = Application(settings)
application = cherrypy.Application(root, script_name='', config=settings)
Run Code Online (Sandbox Code Playgroud)
我用这个application.py安装我的申请,建于当我开发和测试其服务器CherryPy的.
问题是uWSGI本身并没有创建任何线程,而且我的SQLAlchemy插件没有使用它,因为没有cherrypy.engine创建.
uWSGI是否支持使用线程为多个并发请求提供服务的线程?我能在我的网站上启动这些线程application.py吗?uWSGI会理解它并将这些线程用于并发请求吗?怎么能这样呢?我认为cherrypy可以以某种方式使用,或不?那我的SQLAlchemy插件怎么样,我cherrypy.engine只能在仅使用WSGI时启动cherrypy.Application?
任何可以帮助我的帮助或信息将不胜感激.
编辑:
我的uWSGI配置:
<uwsgi>
<socket>127.0.0.1:9001</socket>
<master/>
<daemonize>/var/log/uwsgi/app.log</daemonize>
<logdate/>
<threads/>
<pidfile>/home/web/uwsgi.pid</pidfile>
<uid>uwsgi</uid>
<gid>uwsgi</gid>
<workers>2</workers>
<harakiri>90</harakiri>
<harakiri-verbose/>
<home>/home/web/</home>
<pythonpath>/home/web/instance</pythonpath>
<module>core.application</module>
<no-orphans/>
<touch-reload>/home/web/uwsgi-reload-web</touch-reload>
</uwsgi>
Run Code Online (Sandbox Code Playgroud) 我想将所有请求重定向http到https.
是否有一个通用的方法来设置wsgi.url_scheme,以https在Python 2.7瓶的应用程序?
该应用程序的一般结构是:
setup.py // contains 'install_requires'
wsgi
- myapplication.py // the custom application containing bottle routes
Run Code Online (Sandbox Code Playgroud)
wsgi.url_scheme 似乎与环境变量有关:
http://wsgi.readthedocs.org/en/latest/definitions.html#envvar-wsgi.url_scheme
但我不确定如何实际"设置"环境变量https以及是否可以在setup.py或myapplication.py文件中完成.
这里有一段代码:
https://github.com/defnull/bottle/issues/347
def i_am_https_dammit(app):
def https_app(environ, start_response):
environ['wsgi.url_scheme'] = 'https'
return app(environ, start_response)
return https_app
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何实现这个要点,因为我对应用程序的调用是来自软木塞而且只是使用:
application=default_app()
session_opts = {
'session.cookie_expires': True,
'session.encrypt_key': 'please use a random key and keep it secret!',
'session.httponly': True,
'session.timeout': 3600 * 24, # 1 day
'session.type': …Run Code Online (Sandbox Code Playgroud) 我继承了一个使用 CGI 脚本的代码库。据我所知,它们效率很低,因为每次收到请求时它们都会分叉一个新进程。我目前正在尝试将它们转换为 WSGI,但我对以下内容感到困惑:
WSGI 和 CGI 在代码方面有何不同?我知道该应用程序必须是可调用的,但除此之外,我不确定还需要做什么来更改它。
我如何衡量我所看到的效率提升随着变化而明显的变化?
其他可能有用的信息是我将使用 Apache 和 mod_wsgi。
如果我可以提供任何其他信息,请告诉我。
我无法使用 Python 3.5 解决这个问题。此代码对于 3 之前的 Python 来说是可以的。我正在实现 Django 应用程序所需的 WSGI Web 服务器。
文件的名称是:webserver2.py。但他告诉我
TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?
import socket
#import StringIO
import io
import sys
class WSGIServer(object):
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
request_queue_size = 1
def __init__(self, server_address):
# Create a listening socket
self.listen_socket = listen_socket = socket.socket(
self.address_family,
self.socket_type
)
# Allow to reuse the same address
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# Bind
listen_socket.bind(server_address)
# Activate
listen_socket.listen(self.request_queue_size)
# Get server host name and …Run Code Online (Sandbox Code Playgroud) 我必须安装mod_wsgi在 Apache 2.4 中。我在过去两个小时内搜索了该mod_wsgi.so文件,但什么也没找到。
在哪里可以找到 Windows 上适用于 Python 3.6 的 Apache 2.4 的此文件?
我尝试自己编译它,但出现一些错误。系统不能包含 ap_config.h ...
我正在使用django-rest-framework. 对于授权,我选择使用令牌授权(而不是 JWT)。以下是我尝试过的:
使用邮递员(作品)
headers:
Authorization: Token 329367424fd30a876ccff05dbc5a18d86fe7158c
Run Code Online (Sandbox Code Playgroud)
使用 C# 客户端(不起作用)
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Token 329367424fd30a876ccff05dbc5a18d86fe7158c");
await client.GetAsync(<url>)
// Authentication credentials were not provided.
Run Code Online (Sandbox Code Playgroud)
在我调试和覆盖TokenAuthentication函数后,我意识到Authorization headers如果客户端请求,该函数将被删除C#。
编辑:
实际上我尝试过使用 Javascript 并且它也有效,我认为问题是 C# HttpClient。
我试过
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization3", $"token {token}");
client.DefaultRequestHeaders.Add("Authorization", $"token {token}");
Run Code Online (Sandbox Code Playgroud)
我Authorization在 python 中调试函数,我发现只Authorization3发送到服务器而Authorization不是
完整脚本:
import pprint
def application(environ, start_response):
start_response('200 OK', [('content-type', 'text/html')])
aaa = ['a','b','c']
pprint.pprint(aaa)
Run Code Online (Sandbox Code Playgroud)
如果我要在终端上运行它,那就是......
>>> import pprint
>>> aaa = ['a','b','c']
>>> pprint.pprint(aaa)
['a', 'b', 'c']
>>>
Run Code Online (Sandbox Code Playgroud)
你可以看到它工作正常.但是通过wsgi-script它不起作用.
error_log中:
TypeError:'NoneType'对象不可迭代
BTW是"pprint"PHP中的"print_r()"等价?