警告:如果在单个mod_wsgi进程中运行多个Django站点,则所有站点都将使用碰巧先运行的站点的设置。可以通过以下方法解决:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
在中wsgi.py,至:
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"
或通过使用mod_wsgi守护程序模式并确保每个站点都在其自己的守护进程中运行。
修复UnicodeEncodeError文件上传
如果UnicodeEncodeError在上传文件名包含非ASCII字符的文件时看到,请确保Apache配置为接受非ASCII文件名:
export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
放置此配置的常见位置是/etc/apache2/envvars。
有关详细信息,请参见Unicode参考指南的“ 文件”部分。
使用mod_wsgi守护程序模式
建议使用“守护程序模式”运行mod_wsgi(在非Windows平台上)。要创建所需的守护进程组并委派Django实例在其中运行,您将需要添加适当的 WSGIDaemonProcess和WSGIProcessGroup指令。如果您使用守护程序模式,则对上述配置的进一步更改是您不能使用WSGIPythonPath;相反,您应该使用的python-path选项 WSGIDaemonProcess,例如:
WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com
如果要在子目录中服务项目(https://example.com/mysite在此示例中),则可以添加WSGIScriptAlias 到上面的配置中:
WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com
有关设置守护程序模式的详细信息,请参见mod_wsgi官方文档。
服务文件
Django本身不提供文件;它将工作交给您选择的任何Web服务器。
我们建议使用单独的Web服务器(即未同时运行Django的服务器)来提供媒体服务。这里有一些不错的选择:
- Nginx的
- 精简版的Apache
但是,如果您别无选择,只能在与VirtualHostDjango 相同的Apache上提供媒体文件,则 可以设置Apache以将某些URL用作静态媒体,而将另一些URL使用Django的mod_wsgi接口提供。
这个例子设置的Django在站点根目录,但发球robots.txt, favicon.ico和在什么/static/和/media/URL空间作为静态文件。所有其他URL将使用mod_wsgi提供:
Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico
?
Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/
?
<Directory /path/to/mysite.com/static>
Require all granted
</Directory>
?
<Directory /path/to/mysite.com/media>
Require all granted
</Directory>
?
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
?
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
提供管理文件
在django.contrib.staticfiles中时INSTALLED_APPS,Django开发服务器会自动提供admin应用程序(以及所有其他已安装的应用程序)的静态文件。但是,当您使用任何其他服务器布置时,情况并非如此。您负责设置Apache或您使用的任何Web服务器来提供管理文件。
管理文件位于django/contrib/admin/static/adminDjango发行版的()中。
我们强烈建议您使用django.contrib.staticfiles处理管理文件(如上一节中列出Web服务器一起,使用这种手段collectstatic的管理命令收集的静态文件STATIC_ROOT,然后配置你的Web服务器服务STATIC_ROOT的STATIC_URL),但这里有三个其他方法:
- 从文档根目录创建指向管理静态文件的符号链接(这可能+FollowSymLinks在您的Apache配置中需要)。
- Alias如上所示,使用指令将适当的URL(可能为STATIC_URL+ admin/)别名为管理文件的实际位置。
- 复制管理静态文件,以使它们位于Apache文档根目录中。
从Apache对Django用户数据库进行身份验证
Django提供了一个处理程序,允许Apache直接针对Django的身份验证后端对用户进行身份验证。
由于与多个Apache处理身份验证数据库时保持同步是一个常见问题,因此可以将Apache配置为直接针对Django的身份验证系统进行身份 验证。这需要Apache版本> = 2.2和mod_wsgi> = 2.0。例如:
- 仅将静态/媒体文件直接从Apache提供给经过身份验证的用户。
- 拥有一定的权限,针对Django用户验证对Subversion存储库的访问。
- 允许某些用户连接到使用mod_dav创建的WebDAV共享。
注意:如果您已经安装了自定义用户模型并希望使用此默认身份验证处理程序,则它必须支持一个is_active 属性。如果要使用基于组的授权,则自定义用户必须具有一个名为“组”的关系,该关系引用具有“名称”字段的相关对象。如果您的自定义不符合这些要求,则还可以指定自己的自定义mod_wsgi身份验证处理程序。
使用进行身份验证mod_wsgi
注意:在以下配置中使用时,假设您的Apache实例仅运行一个Django应用程序。如果您正在运行多个Django应用程序,请参阅mod_wsgi文档的“ 定义应用程序组”部分以获取有关此设置的更多信息。WSGIApplicationGroup %{GLOBAL}
确保已安装并激活了mod_wsgi,并且已按照步骤使用mod_wsgi设置Apache。
接下来,编辑您的Apache配置,以添加仅希望经过身份验证的用户才能查看的位置:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com
?
WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
?
<Location "/secret">
AuthType Basic
AuthName "Top Secret"
Require valid-user
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>
该WSGIAuthUserScript指令告诉mod_wsgi check_password在指定的wsgi脚本中执行该 功能,并传递从提示符处收到的用户名和密码。在此示例中,与 定义由django-admin startproject创建的应用程序WSGIAuthUserScript的相同。WSGIScriptAlias
结合使用Apache 2.2和身份验证
确保mod_auth_basic和mod_authz_user已加载。
这些可能会静态地编译到Apache中,或者您可能需要使用LoadModule在您的中动态加载它们httpd.conf:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so
最后,mysite.wsgi通过导入以下check_password 功能来编辑WSGI脚本,以将Apache的身份验证与站点的身份验证机制联系起来:
import os
?
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
?
from django.contrib.auth.handlers.modwsgi import check_password
?
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
/secret/现在开始的请求将要求用户进行身份验证。
mod_wsgi 访问控制机制文档提供了其他详细信息和有关替代身份验证方法的信息。
mod_wsgi和Django组的授权
mod_wsgi还提供了将特定位置限制为组成员的功能。
在这种情况下,Apache配置应如下所示:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
?
WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
?
<Location "/secret">
AuthType Basic
AuthName "Top Secret"
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
Require group secret-agents
Require valid-user
</Location>
为了支持该WSGIAuthGroupScript指令,相同的WSGI脚本 mysite.wsgi还必须导入该groups_for_user函数,该函数返回给定用户所属的列表组。
from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user
如果有需求/secret/,现在也需要用户是“秘密特工”组的成员。
详情参考: https://docs.djangoproject.com/en/3.0/
标签:Django
相关阅读 >>
更多相关阅读请进入《Django》频道 >>

Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。