2008-09-19 4 views
11

Ich bin dabei, eine Beta-Version der Seite, an der ich gerade arbeite, im Internet zu veröffentlichen. Es muss einen Beta-Code haben, um den Zugriff zu beschränken. Die Seite ist in Django geschrieben.Einen Beta-Code für eine öffentliche Django-Site erstellen

Ich möchte nicht das grundlegende Auth-System ändern, um einen Beta-Code unterzubringen, und es ist mir nicht besonders wichtig, dass die Sicherheit des Beta-Codes eisenbeschichtet ist, nur dass es ein bedeutender Stolperstein ist.

Wie soll ich das tun? Es ist ein ziemlich großes Projekt, daher ist das Hinzufügen von Code zu jeder Ansicht alles andere als ideal.


Diese Lösung funktioniert gut. Die Middleware-Klasse endete ich mit diesem auf den Punkt:

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

Antwort

19

beginnen mit this Django snippet, aber ändern Sie es request.session['has_beta_access'] zu überprüfen. Wenn sie es nicht haben, dann lassen Sie es eine Umleitung zu einer Seite "Beta-Code eingeben" zurückgeben, die, wenn sie mit dem richtigen Code veröffentlicht wird, diese Sitzungsvariable auf True setzt.

ihm eine öffentliche Beta macht dann besteht nur aus, dass die Middleware von Ihrer MIDDLEWARE_CLASSES Einstellung zu entfernen.

0

Sie sollten in der Lage @login_required Dekorateure auf der ganzen Linie zu addieren und mit ihr geschehen. Es sei denn, Sie haben eine Boot-Ladung von View-Funktionen, sollte es nicht zu schrecklich sein.

+0

Das Problem dabei ist, dass dann, wer versucht, Zugang zu erhalten, auf die Anmeldeseite genommen wird, anstatt auf eine Seite für die Eingabe eines Beta-Codes. Die Login-Seite hat alle Menüs und UI um sie herum. Ich möchte das Zeug für jetzt privat behalten. – defrex

+0

@defrex, machen Sie Ihren eigenen login_required Decorator, der Djangos eingebaute Version umschließt. Wenn Sie live gehen, ersetzen Sie es einfach durch Djangos. –

4

Sie können wahrscheinlich den Zugriff auf die gesamte Website über Apache mit htaccess beschränken, wodurch das Problem aus dem Projektraum des Djangos vollständig beseitigt wird.

2

Machen Sie was StackOverflow getan hat.

Sie hatten ein einfaches E-Mail/Passwort-Formular. Es hatte ein einziges fest codiertes Passwort (falkensmaze). Wenn der Benutzer das Passwort richtig bekommt, setze einen Cookie. z.B. auth = 1

Mach dir keine Sorgen darüber, dass es unsicher ist. Wen interessiert es, wenn jemand in die Beta eingreift?

Apache/htaccess ist auch eine nette und einfache Lösung.

+0

Das bedeutet, dass ich in jeder Ansicht nach dem Vorhandensein eines Cookies suchen muss.Ich würde lieber vermeiden, Code zu jeder Ansicht hinzuzufügen. Gibt es eine Möglichkeit, global nach einem Cookie im Django zu suchen? – defrex

+0

@defrex ja mit einer Middleware. Siehe AdamKG Antwort. – imns

0

Ich bin mir nicht sicher, welche Version des Pinax Code Sie verwenden, aber sie haben in der Fähigkeit gebaut, um den Standort aus für eine private Beta zu schließen, so dass Sie brauchen, um sich nicht viel zu tun, zu arbeiten.

Der Link zu der spezifischen Projektvorlage für eine private Beta-Site ist hier: http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project obwohl ich denke, dass sie diese Funktionalität seither allen Projektvorlagen hinzugefügt haben.

+0

Eine wirklich alte Version von Pinax. Die Frage wurde am 8. September gestellt. Es ist jedoch ein guter Punkt, also habe ich den Bezug auf Pinax aus der Frage gestrichen, damit die Leute nicht in die Irre geführt werden. – defrex

0

Great Snippet, aber es ergab viele Probleme für mich verwandte OpenId-Sitzungen. So habe ich am Ende auf Plätzchen unter Berufung auf statt der 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 

Es ist nicht sicher, aber das ist genug für mich. Dies funktioniert auch mit nur einer Beta-HTML-Seite.

Verwandte Themen