![在守护进程模式下运行 Apache/mod_wsgi 的 Django 应用时出现文件上传问题](https://linux22.com/image/494060/%E5%9C%A8%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%BC%8F%E4%B8%8B%E8%BF%90%E8%A1%8C%20Apache%2Fmod_wsgi%20%E7%9A%84%20Django%20%E5%BA%94%E7%94%A8%E6%97%B6%E5%87%BA%E7%8E%B0%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E9%97%AE%E9%A2%98.png)
我有一个使用 mod_wsgi 在 Apache2 (linux) 下运行的 Django 应用程序,在守护进程模式下运行时文件上传失败,但在嵌入 Python 解释器时可以上传。知道是什么原因造成的吗?我该如何修复它?
以下 Apache 配置正在运行:
<VirtualHost *:80>
ServerName mysite.com
DocumentRoot /var/www/
Alias /media/ /var/www/media/
<Directory /var/www/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
Include /etc/apache2/yslow_optimizations.conf
</Directory>
WSGIScriptAlias / /var/djangoapp/apache/django.wsgi
<Directory /var/djangoapp/apache/>
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/mysite.error.log
CustomLog /var/log/apache2/mysite.access.log combined
</VirtualHost>
但是,当我添加以下指令来守护 wsgi 进程时,文件上传立即失败。
WSGIDaemonProcess mygroup display-name=%{GROUP} inactivity-timeout=600
WSGIProcessGroup mygroup
Apache 错误日志中似乎没有任何内容。
Django 表单使用 FileField,在执行 form.is_valid() 时只会给出“此字段是必填项”错误。视图有一个 @login_required 装饰器。在嵌入模式下运行时,所有这些都运行良好。
作为守护进程运行可以更加优雅地更新代码(只需触碰 wsgi 文件),而不是嵌入时需要 Apache 重新加载,所以如果可能的话我更喜欢这样。
更新:该问题出现在 Opera 上,而不是 FireFox 上。
答案1
猜测一下,您没有运行最新的 mod_wsgi 2.X 版本,并且正在使用 Opera 浏览器。
使用 mod_wsgi 守护进程模式时,Opera 及其 HTTP 100-continue 的使用存在一个已知问题。此问题已在 mod_wsgi 2.4 中修复。
虽然您没有说正在使用哪个版本的 mod_wsgi,也没有说正在使用哪种浏览器,但这只是猜测。