为公共Django网站制作Beta版代码
我即将在网络上发布我正在研究的网站的测试版。它需要一个Beta代码来限制访问。该网站是用Django编写的。
我不想更改基本的Auth系统以容纳Beta代码,并且我也不在乎Beta代码的安全性是铁定的,只是这是一个重要的绊脚石。
我应该怎么做?这是一个相当大的项目,因此向每个视图添加代码远非理想。
该解决方案效果很好。我最终得到的中间件类是这样的:
from django.http import HttpResponseRedirect
class BetaMiddleware(object):
"""
Require beta code session key in order to view any page.
"""
def process_request(self, request):
if request.path != '/beta/' and not request.session.get('in_beta'):
return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))
解决方案
我们应该能够全面添加@ login_required装饰器并完成它。除非我们拥有大量的视图功能,否则它应该不会太可怕。
我们可能可以使用htaccess通过apache限制对整个站点的访问,从而将问题完全排除在Django的项目空间之外。
做StackOverflow所做的。
他们有一个简单的电子邮件/密码表格。它只有一个硬编码的密码(falkensmaze)。当用户正确获得密码后,设置一个cookie。例如。认证= 1
不必担心它不安全。谁在乎是否有人闯入Beta?
Apache / htaccess也是一个很好且简单的解决方案。
从此Django片段开始,但对其进行修改以检查request.session ['has_beta_access']。如果他们没有,则将其返回到"输入beta代码"页面的重定向,该页面在以正确的代码发布到该页面时,会将该会话变量设置为" True"。
然后,使其成为公共测试版,只需从MIDDLEWARE_CLASSES设置中删除该中间件即可。
我不确定我们使用的是哪个版本的Pinax代码,但它们具有关闭该网站以进行内部Beta测试的功能,因此我们无需自己做很多工作。
专用Beta版网站的特定项目模板的链接位于:http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project,尽管我认为他们可能已经在所有项目中添加了该功能模板。
很棒的代码段,但它给我带来了很多与OpenId会话相关的问题。因此,我最终依赖于Cookies而不是Session:
class BetaMiddleware(object):
"""
Require beta code cookie key in order to view any page.
"""
set_beta = False
def process_request(self, request):
referer = request.META.get('HTTP_REFERER', '')
if request.method == 'GET' and not 'is_in_beta' in request.COOKIES:
return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))
if request.method == 'POST' and 'pass' in request.POST:
code = request.POST['pass']
if code=='beta':
self.set_beta = True
return HttpResponseRedirect('%s' % '/')
def process_response(self, request, response):
if self.set_beta is True:
response.set_cookie('is_in_beta', '1')
return response
这不是安全的,但对我来说足够了。这也仅适用于beta html页面。

