代码之家  ›  专栏  ›  技术社区  ›  Craig McQueen

为公共django站点制作测试版代码

  •  11
  • Craig McQueen  · 技术社区  · 18 年前

    我不想改变基本的身份验证系统来适应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))
    
    6 回复  |  直到 12 年前
        1
  •  21
  •   AdamKG    18 年前

    从 this Django snippet ,但将其修改为检查 request.session['has_beta_access'] True .

    MIDDLEWARE_CLASSES 背景

        2
  •  4
  •   rcreswick    18 年前

    您可能可以通过apache with htaccess限制对整个站点的访问,从而将问题完全排除在django的项目空间之外。

        3
  •  2
  •   andyuk    18 年前

    做StackOverflow做过的事。

    不要担心它不安全。谁在乎有人入侵测试版?

    Apache/htaccess也是一个很好且简单的解决方案。

        4
  •  0
  •   S.Lott    18 年前

    @login_required 装潢师们一刀切地去做。除非你有大量的视图功能,否则它不会太可怕。

        5
  •  0
  •   John Debs    17 年前

    我不确定您使用的是哪一版本的Pinax代码,但它们内置了关闭站点进行私人测试的功能,因此您不需要自己做太多工作。

    专用测试版网站的特定项目模板链接如下: http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project 尽管我认为他们可能已经在所有项目模板中添加了该功能。

        6
  •  0
  •   ercu    16 年前

    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
    

    虽然不安全,但对我来说已经足够了。这也适用于测试版html页面。

        7
  •  0
  •   user1387219    6 年前

    使用此中间件:

    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"),