标签: wsgi

Python,WSGI,多处理和共享数据

我对mod_wsgi的多重管理功能以及将在具有多处理能力的WSGI服务器上执行的WSGI应用程序的一般设计感到困惑.

请考虑以下指令:

WSGIDaemonProcess example processes=5 threads=1
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,mod_wsgi将生成5个Python(例如CPython)进程,并且这些进程中的任何一个都可以接收来自用户的请求.

文件说:

共享数据需要对所有应用程序实例可见,无论它们执行哪个子进程,并且一个应用程序对数据所做的更改都可以立即供另一个应用程序使用,包括在另一个子进程中执行的任何子进程,外部数据存储,如必须使用数据库或共享内存.普通Python模块中的全局变量不能用于此目的.

但是在这种情况下,当想要确定应用程序在任何WSGI条件(包括多处理条件)中运行时,它会变得非常沉重.

例如,一个包含当前连接用户数量的简单变量 - 它应该是从/向memcached进行过程安全读/写,还是DB或(如果有这样的标准库机制可用)共享记忆?

并且代码会像

counter = 0

@app.route('/login')
def login():
    ...
    counter += 1
    ...

@app.route('/logout')
def logout():
    ...
    counter -= 1
    ...

@app.route('/show_users_count')
def show_users_count():
    return counter
Run Code Online (Sandbox Code Playgroud)

在多处理环境中表现不可预测?

谢谢!

python mod-wsgi wsgi multiprocessing

23
推荐指数
1
解决办法
2万
查看次数

如何获得使用apache的wsgi_mod版本?

我正在使用ubuntu 12.041并通过apt-get安装了apache.

我不知道我正在使用什么版本的mod_wsgi,虽然我谷歌关于它.我发现你可以使用apachctl重新启动你的apache,你会得到类似"Apache/2.2.2(Unix)mod_wsgi/1.0 Python/2.3配置"的东西.但这并没有发生在我身上.

有什么方法可以知道我使用的是什么版本?谢谢.

apache mod-wsgi wsgi

22
推荐指数
4
解决办法
2万
查看次数

将命令行参数传递给uwsgi脚本

我正在尝试将参数传递给示例wsgi应用程序,:

config_file = sys.argv[1]

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World %s" % config_file]
Run Code Online (Sandbox Code Playgroud)

并运行:

uwsgi --http :9090 --wsgi-file test_uwsgi.py  -???? config_file # argument for wsgi script
Run Code Online (Sandbox Code Playgroud)

我能做到的任何聪明方式吗?无法在uwsgi文档中找到它.也许还有另一种方法可以为wsgi应用程序提供一些参数?(环境变量超出范围)

python wsgi uwsgi

22
推荐指数
2
解决办法
8536
查看次数

在守护进程模式下调整mod_wsgi

我在守护进程模式下运行apache mod_wsgi上的wsgi应用程序.我在配置中有这些行

WSGIDaemonProcess app processes=2 threads=3 display-name=%{GROUP} 
WSGIProcessGroup app
Run Code Online (Sandbox Code Playgroud)

如何找到进程和线程的最佳组合/调优?

编辑:此链接[在下面的回答中给出]是非常有用的:https: //serverfault.com/questions/145617/apache-2-2-mpm-worker-more-threads-or-more-processes/146382#146382

现在,我的问题是:如果我的服务器为我的需求提供了相当好的性能,我应该减少线程数以提高稳定性/可靠性吗?我可以把它设置为1吗?

python apache mod-wsgi wsgi

20
推荐指数
1
解决办法
1万
查看次数

uwsgi选项--wsgi-file和--module无法识别

我正在尝试使用uwsgi运行Django应用程序.我发现的大多数指令都引用了"--wsgi-file"和"--module"来指定应用程序,但是"uwsgi"没有提到这些选项,当我尝试使用它们时:

uwsgi -s /tmp/uwsgi.sock --master --module myapp.wsgi
uwsgi: unrecognized option '--module'
getopt_long() error
Run Code Online (Sandbox Code Playgroud)

uwsgi -s /tmp/uwsgi.sock --master --wsgi-file myapp/wsgi.py
uwsgi: unrecognized option '--wsgi-file'
getopt_long() error
Run Code Online (Sandbox Code Playgroud)

当我没有任何一个运行时,我得到:

uwsgi -s /tmp/uwsgi.sock --master 
*** Starting uWSGI 2.0.9 (64bit) on [Fri Jul 10 11:12:04 2015] ***
compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-11) on 23 April 2015 19:31:15
os: Linux-2.6.32-504.16.2.el6.x86_64 #1 SMP Tue Mar 10 17:01:00 EDT 2015
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 2 …
Run Code Online (Sandbox Code Playgroud)

wsgi django-wsgi uwsgi

20
推荐指数
1
解决办法
2万
查看次数

在发送实际响应之前发送请求的间歇状态

我有一台服务器,需要几分钟时间来处理特定请求然后响应它.

客户端必须等待响应,而不知道何时完成.

有没有办法让客户知道处理状态?(比如50%完成,80%完成),客户不需要轮询状态.

python client-server wsgi http uwsgi

20
推荐指数
1
解决办法
1019
查看次数

在Flask(WSGI)中使用全局单例,我是否必须担心竞争条件?

Flask的hello world演示是:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
Run Code Online (Sandbox Code Playgroud)

如果我这样修改了怎么办:

from flask import Flask
app = Flask(__name__)

a = 1
b = 2
c = 3

@app.route("/")
def hello():
    a += 1
    b += a
    c += b
    return "Hello World!"

if __name__ == "__main__":
    app.run()
Run Code Online (Sandbox Code Playgroud)

我理解WSGI应用程序可能有多个线程.该hello函数可以同时在多个线程上运行,然后我们就会遇到竞争条件.它是否正确?如果上面的代码不是线程安全的,我该怎么做才能使它的线程安全?

避免全局变量是一种可能的解决方案,但是你总能避免使用全局变量吗?如果我想要类似python对象缓存的内容怎么办?

python wsgi thread-safety race-condition flask

19
推荐指数
3
解决办法
1万
查看次数

使用Jinja2模板缩小Flask应用程序的HTML输出

是否有Flask或Jinja2配置标志/扩展名来在渲染模板后自动缩小HTML输出?

python wsgi web-applications jinja2 flask

19
推荐指数
5
解决办法
1万
查看次数

Django:WSGIRequest'对象在某些页面上没有属性'user'?

我想在用户登录时设置cookie.

我的中间件:

class UserStatus(object):
    def process_response(self,request,response):
        user_status = 1 if request.user.is_authenticated() else 0
        max_age = (20)*52*7*24*60*60 # 20 years (After expiry, cookie gets deleted)
        response.set_cookie(user_status_cookie,user_status,max_age)
        return response
Run Code Online (Sandbox Code Playgroud)

最后添加到MIDDLEWARE_CLASSESsettings.py中.

问题:

  • 错误:'WSGIRequest'对象没有属性'user'
  • 为什么,当我已经启用身份验证和会话中间件时?
  • 此外,有些页面正在顺利运行,因为有些页面会出现此错误.
  • 我究竟做错了什么 ?

python django wsgi django-middleware

18
推荐指数
4
解决办法
3万
查看次数

当我在gunicorn上运行Flask应用程序时设置app.wsgi_app = ProxyFix(app.wsgi_app)会发生什么?

我使用Flask构建了一个基本的Web应用程序,并且能够使用其本机http服务器从虚拟机运行它.我很快意识到,通过这个设置,请求被阻止(我无法对资源进行并发请求;任何新请求都要等到早期请求完成),并决定尝试使用gunicorn运行应用程序来解决此问题.我按照文档,特别是使用此行运行:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 
Run Code Online (Sandbox Code Playgroud)

但是,它无法启动这样做,并抱怨没有WSGI应用程序.在互联网上闲聊,我发现有很多人发布了以下示例:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
Run Code Online (Sandbox Code Playgroud)

我补充说,它解决了我的问题.我很困惑,因为这显然是为了解决在HTTP代理后面服务的问题,但是增加的gunicorn会强加一个HTTP代理吗?或者我总是落后于代理,而Flask的内置服务器并不重要?

此外,Werkzeug关于Fixers的文档警告"出于安全原因,不要在非代理设置中使用此中间件." 考虑到修复显然是必要的,我可以假设我正在进行代理设置吗?

python wsgi werkzeug flask gunicorn

18
推荐指数
2
解决办法
7590
查看次数