通过可配置的预览授权锁定Django站点或单个视图
项目描述
django-lockdown 是一个可重用的Django应用程序,用于锁定整个站点(或特定的视图),具有可定制的日期范围和预览授权。
安装
使用 easy_install 或 pip 从PyPI安装
pip install django-lockdown
要在您的Django项目中使用 django-lockdown
将 'lockdown' 添加到您的 INSTALLED_APPS。如果您想使用 django-lockdowns 的默认锁定表单之一,您还必须确保您已将 django.contrib.auth 作为您的 INSTALLED_APPS 的一部分启用。
要启用对锁定站点或视图的密码的行政预览,请将 LOCKDOWN_PASSWORDS 设置为一个包含一个或多个纯文本密码的元组。
使用中间件来保护整个站点,或者通过应用装饰器来保护单个视图。
有关高级自定义管理员预览授权的更多信息,请参阅 LOCKDOWN_FORM 设置。
依赖项
django-lockdown 需要 Python 3.6 或更高版本以及 Django 2.2 或更高版本。
作为 CPython 的替代方案,也支持 PyPy 3.5 和 3.6。
用法
使用中间件
要锁定整个站点,请将 lockdown 中间件添加到您的中间件中
MIDDLEWARE = [ # ... 'lockdown.middleware.LockdownMiddleware', ]
可选地,您还可以将 URL 正则表达式添加到 LOCKDOWN_URL_EXCEPTIONS 设置中。
使用装饰器
导入装饰器
from lockdown.decorators import lockdown
将装饰器应用于您想要保护的单个视图。例如
@lockdown() def secret_page(request): # ...
装饰器接受七个参数
- form
用于提供管理员预览的表单,而不是由 LOCKDOWN_FORM 引用的表单。请注意,这必须是一个实际的表单类,而不是设置中的模块引用。
- until_date
使用此日期而不是由 LOCKDOWN_UNTIL 提供的日期。
- after_date
使用此日期而不是由 LOCKDOWN_AFTER 提供的日期。
- logout_key
使用预览注销密钥,而不是由 LOCKDOWN_LOGOUT_KEY 提供的密钥。
- session_key
使用会话密钥,而不是由 LOCKDOWN_SESSION_KEY 提供的密钥。
- url_exceptions
一组正则表达式列表,匹配的 URL 可以绕过锁定(而不是使用 LOCKDOWN_URL_EXCEPTIONS 中定义的)。
- remote_addr_exceptions
一组 IP 地址或 IP 子网列表,匹配的 URL 可以绕过锁定(而不是使用 LOCKDOWN_REMOTE_ADDR_EXCEPTIONS 中定义的)。
- extra_context
一个字典,其中包含将添加到传递给模板的默认上下文数据中的上下文数据。
任何其他关键字参数都将传递给管理员预览表单。默认表单接受一个参数
- passwords
一个密码元组,用于替代由 LOCKDOWN_PASSWORDS 提供的密码。
设置
LOCKDOWN_ENABLED
一个可选的布尔值,如果设置为 False,则全局禁用 django-lockdown。默认为 True(锁定启用)。
LOCKDOWN_PASSWORDS
一个或多个明文密码,允许预览由 django-lockdown 保护站点或视图。
LOCKDOWN_PASSWORDS = ('letmein', 'beta')
如果此设置未提供(并且正在使用默认的 LOCKDOWN_FORM),则锁定页面将没有管理员预览。
如果使用除默认以外的 LOCKDOWN_FORM,则此设置无效。
LOCKDOWN_URL_EXCEPTIONS
一个可选的列表/元组,其中包含将匹配传入 URL 的正则表达式。如果 URL 匹配此列表中的正则表达式,则它将不会被锁定。例如
LOCKDOWN_URL_EXCEPTIONS = ( r'^/about/$', # unlock /about/ r'\.json$', # unlock JSON API )
LOCKDOWN_VIEW_EXCEPTIONS
一个可选的正则表达式列表,将匹配传入请求的解析视图。如果传入请求的 URL 解析到列表中的视图之一,则它将不会被锁定。这对于您想要使用中间件锁定整个站点,但又想将某些本地化 URL 加入白名单的情况很有用。
例如
from yourapp import one_view_to_unlock, another_view_to_unlock LOCKDOWN_VIEW_EXCEPTIONS = [ one_view_to_unlock, another_view_to_unlock ]
LOCKDOWN_REMOTE_ADDR_EXCEPTIONS
一个可选的 IP 地址或 IP 子网列表,将匹配请求 IP 地址(从 requests.META[‘REMOTE_ADDR’])。如果请求 IP 地址在此列表中,则它将不会被锁定。例如
LOCKDOWN_REMOTE_ADDR_EXCEPTIONS = [ '127.0.0.1', '::1', ]
LOCKDOWN_TRUSTED_PROXIES
使用反向代理或负载均衡器时,与LOCKDOWN_REMOTE_ADDR_EXCEPTIONS结合使用的可信代理IP地址列表。如果请求的IP地址来自可信代理列表,则将从X-Forwarded-For头(从requests.META['HTTP_X_FORWARDED_FOR'])检查最后一个地址是否在LOCKDOWN_REMOTE_ADDR_EXCEPTIONS中,并根据需要锁定或解锁。
例如
LOCKDOWN_TRUSTED_PROXIES = [ '172.17.0.1', ] LOCKDOWN_REMOTE_ADDR_EXCEPTIONS = [ '172.17.0.5', ]
LOCKDOWN_UNTIL
用于锁定网站直到某个日期。设置为datetime.datetime对象。
如果既没有提供LOCKDOWN_UNTIL也没有提供LOCKDOWN_AFTER(默认值),则网站或视图将始终被锁定。
LOCKDOWN_AFTER
用于在某个日期之后锁定网站。设置为datetime.datetime对象。
另请参阅:LOCKDOWN_UNTIL。
LOCKDOWN_LOGOUT_KEY
一个键,如果在锁定URL的查询字符串中提供,将使用户从预览中注销。
LOCKDOWN_FORM
默认锁定表单允许管理员通过输入预置的纯文本密码进行预览(默认情况下,与LOCKDOWN_PASSWORDS设置进行校验)。要设置更高级的访问锁定页面的认证方法,将LOCKDOWN_FORM设置为指向Django Form子类的Python点路径。此表单将在锁定页面上显示。如果表单在提交时通过验证,则允许用户访问锁定页面
LOCKDOWN_FORM = 'path.to.my.CustomLockdownForm'
django-lockdown提供用于对django.contrib.auth用户进行认证的表单(使用LOCKDOWN_FORM = 'lockdown.forms.AuthForm')。它接受两个关键字参数(在lockdown装饰器中)
- staff_only
仅允许员工预览。默认为True(但默认值可以作为LOCKDOWN_AUTHFORM_STAFF_ONLY设置提供)。
- superusers_only
仅允许超级用户预览。默认为False(但默认值可以作为LOCKDOWN_AUTHFORM_SUPERUSERS_ONLY设置提供)。
LOCKDOWN_AUTHFORM_STAFF_ONLY
如果使用lockdown.forms.AuthForm并且此设置设置为True,则只允许员工预览(默认为True)。
如果没有使用lockdown.forms.AuthForm,则没有效果。
LOCKDOWN_AUTHFORM_SUPERUSERS_ONLY
如果使用lockdown.forms.AuthForm并且此设置设置为True,则只允许超级用户预览(默认为False)。如果没有使用lockdown.forms.AuthForm,则没有效果。
LOCKDOWN_SESSION_KEY
一旦客户端获得管理员预览授权,他们将在浏览会话的剩余时间内继续获得授权(使用Django的内置会话支持)。LOCKDOWN_SESSION_KEY定义了使用的会话键;默认为'lockdown-allow'。
模板
django-lockdown使用单个模板,lockdown/form.html。默认模板显示简单的“即将推出”消息和预览授权表单,如果通过LOCKDOWN_PASSWORDS设置了密码。
如果您想使用不同的模板,可以使用Django模板加载器指定要搜索模板的项目路径,在搜索django-lockdown中包含的模板之前。
在您覆盖的模板中,锁定预览表单在模板上下文中可用,为form。
CHANGES
4.0.0 (2021-02-14)
移除对已停用 Django 版本的(1.11、2.0 和 2.1)支持。
添加对 Python 3.9 的支持,并移除对 Python 3.5 的支持。
添加对 Django 3.1 的支持。
3.0.0. (2020-01-01)
添加了对 Python 3.8 的支持。
添加了对 Django 3.0 的支持。
移除了对 Python 2.7 和 3.4 的支持。
2.0.0 (2019-05-26)
在使用基于 IP 地址的锁定异常时添加了对代理的支持。
这引入了一个破坏性变化:位于代理后面的安装需要设置新引入的 LOCKDOWN_TRUSTED_PROXIES,否则通过代理访问站点时将不再授权。
当使用中间件锁定整个站点时,添加了对白名单视图的支持。
添加了对 Django 2.2 的支持。
仅对 Python <3.3 要求 mock 作为单独的第三方测试依赖。
修复了压缩 IP 地址的检测。
这为使用 REMOTE_ADDR_EXCEPTIONS 功能并将在配置中将 IP 地址作为字节字符串传递的用户引入了一个破坏性变化。虽然不太可能有人用 Python 3 做这件事,但在 Python 2 中它是默认的。在这个版本中,字节字符串不再起作用,但需要使用 Unicode 字符串。
添加了指定远程地址异常的 IP 子网的能力。
1.6.0 (2018-11-25)
停止支持 Django <=1.10。
停止支持 Python 3.3。
添加了绕过配置 IP 地址锁定的能力。
在提交和 CI 期间集成 pre-commit 以进行代码风格检查。
添加了对 Django 2.1 的支持。
添加了对 Python 3.7 的支持。
添加了对 PyPy 的支持。
1.5.0 (2017-12-05)
添加了对 Django 2.0 的支持。
在某些区域改进了代码风格。
1.4.2 (2017-04-07)
修复了 PyPi 的格式问题。
1.4.1 (2017-04-07)
修复了 PyPi 上传问题。
1.4.0 (2017-04-06)
重构测试以使用 Mocks。
添加了对 Python 3.6 的支持。
添加了对 Django 1.11 的支持。
1.3 (2016-08-07)
添加了对 Django 1.10 的支持。
添加了对向锁定模板提供附加上下文数据的支持。
1.2 (2015-12-03)
添加了对 Python 3.5 的支持。
添加了对 Django 1.9 的支持。
停止支持 Django <=1.7。
修复了在装饰器参数中指定时无法正常工作的 URL 异常。
改进了测试。
1.1 (2015-04-06)
在 0.1.2 和 0.1.3 版本在 1.0 版本发布后标记后,这是 0.1.2 和 0.1.3 的最后一个版本。它包含所有新功能,尤其是对 Python 3 的支持。
django-lockdown 的最后一个版本,支持 Django 1.3、1.5 和 1.6。未来的版本将仅支持具有官方安全支持的 Django 版本。目前这些是 Django 1.4 LTS、1.7 和 1.8 LTS。
修复了 Django >=1.7 的测试。
0.1.3(2014-03-15)(从未发布)
添加了 LOCKDOWN_ENABLED 设置。
删除了 decorator_from_middleware_with_args 的 Django 1.1 迁移。
0.1.2(2014-03-15)(从未发布)
至少需要 Django 1.3。
修复了测试运行脚本,使其与最近的 Django 版本兼容。
将 csrf_token 模板标签添加到包含的表单模板中。
对 Python 3 兼容性进行了少量语法调整。
1.0 (2013-07-10)
向后不兼容:允许多个密码(密码设置已从 LOCKDOWN_PASSWORD 更改为 LOCKDOWN_PASSWORDS)。
装饰器改为可调用装饰器(因此可以为单个装饰器覆盖设置)。
添加了 AuthForm,可用于允许通过认证用户进行预览(通过 django.contrib.auth)。
允许锁定到特定日期之前或之后。
0.1.1 (2009-11-24)
修复了 setup.py,以确保不安装 tests 包。
0.1 (2009-11-16)
初始发布。