为公共Django网站制作Beta版代码

时间:2020-03-06 14:27:54  来源:igfitidea点击:

我即将在网络上发布我正在研究的网站的测试版。它需要一个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页面。