如何在Django与mod_wsgi中设置PYTHONHASHSEED环境变量?

0 投票
1 回答
528 浏览
提问于 2025-04-18 03:19

如何在设置了PYTHONHASHSEED环境变量为随机值的情况下,用mod_wsgi运行Django?在Django的设置中这样设置是否合适?

os.environ['PYTHONHASHSEED'] = 'random'

1 个回答

2

mod_wsgi 4.1.0版本引入了一个新选项,你可以在Apache的配置文件中添加这个选项,具体可以查看这个链接:http://modwsgi.readthedocs.org/en/latest/release-notes/version-4.1.0.html

WSGIPythonHashSeed random

如果你不能运行这个版本,那么你需要在Apache进程的启动环境中设置一个变量,这个设置会根据操作系统的不同而有所不同。比如在Fedora或RHEL 7中,你可以创建一个文件:/etc/systemd/system/httpd.service:

.include /lib/systemd/system/httpd.service
[Service]
Environment=PYTHONHASHSEED=random

然后运行命令 systemctl daemon-reload; systemctl restart httpd.service 来重新加载服务并重启Apache。如果你使用的是较早的Red Hat版本(没有systemd),你可以编辑文件 /etc/sysconfig/httpd。而在Debian系统中,相关文件是 /etc/apache2/envvars。

这里有一个WSGI文件可以用来测试是否正常工作(这个例子是根据mod_wsgi文档中的示例来的):

import sys

def application(environ, start_response):
    status = '200 OK'

    try:
        hr = sys.flags.hash_randomization
        if hr == 0:
            output = 'Hash randomization disabled'
        elif hr == 1:
            output = 'Hash randomization enabled'
        else:
            output = 'Unknown hash randomization: ' + str(hr)
    except AttributeError:
        output = 'Hash randomization not supported'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

撰写回答