我即将把我正在开发的网站的测试版本放到网上。它需要有一个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))
答案 0 :(得分:19)
从this Django snippet开始,但修改它以检查request.session['has_beta_access']
。如果他们没有,请将其重定向返回到“输入测试代码”页面,当使用正确的代码发布时,将该会话变量设置为True
。
将其设为公开测试版只需从您的MIDDLEWARE_CLASSES
设置中删除该中间件即可。
答案 1 :(得分:4)
您可以通过带有htaccess的apache限制对整个站点的访问,完全将问题排除在django的项目空间之外。
答案 2 :(得分:2)
执行StackOverflow的操作。
他们有一个简单的电子邮件/密码表格。它有一个硬编码密码(falkensmaze)。当用户获得密码时,设置一个cookie。例如。 AUTH = 1
不要担心它不安全。如果有人闯入测试版,谁会关心?
Apache / htaccess也是一个很好的简单解决方案。
答案 3 :(得分:0)
您应该能够全面添加@login_required
装饰器并完成它。除非你有一大堆观察功能,否则它不应该太可怕。
答案 4 :(得分:0)
我不确定您使用的是什么版本的Pinax代码,但是他们已经建立了关闭网站私有测试版的能力,因此您不需要自己做太多工作。
私有测试版网站的特定项目模板的链接位于:http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project,但我认为他们可能已将该功能添加到所有项目模板中。
答案 5 :(得分:0)
很棒的片段,但它为我的相关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页面。
答案 6 :(得分:0)
使用此中间件:
class BetaForm(Form):
beta_pass = CharField(required=True)
def clean_beta_pass(self):
data = self.cleaned_data['beta_pass']
if data != settings.BETA_PASS:
raise forms.ValidationError("Invalid Beta pass!")
return data
class BetaView(FormView):
form_class = BetaForm
template_name = "beta.html"
def form_valid(self, form):
response = HttpResponseRedirect(self.request.GET.get("next", "/"))
response.set_cookie(settings.BETA_PASS, '')
return response
def beta_middleware(get_response):
def middleware(request):
if request.path == reverse("beta"):
return get_response(request)
else:
if settings.BETA_PASS in request.COOKIES:
return get_response(request)
else:
return HttpResponseRedirect(
'%s?%s' % (reverse("beta"), urlencode({"next": request.get_full_path()})))
return middleware
此模板:
<!doctype html>
<title>Welcome to the beta!</title>
<style>
body { text-align: center; padding: 150px; }
h1 { font-size: 50px; }
body { font: 20px Helvetica, sans-serif; color: #333; }
article { display: block; text-align: left; width: 650px; margin: 0 auto; }
a { color: #dc8100; text-decoration: none; }
a:hover { color: #333; text-decoration: none; }
</style>
<article>
<h1>>Welcome to the beta lucky user!</h1>
<div>
<form method="POST">
{% csrf_token %}
{{form}}
<input type="submit">
</form>
</div>
</article>
此设置:
BETA_PASS="beta"
此路径:
path("beta",BetaView.as_view(),name="beta"),