SORU
29 Ocak 2010, Cuma


'in Django yapmak için en iyi yolu, varsayılan login_required

Büyük çoğunluğu erişmek için bir oturum açma gerektirir büyük bir Django uygulaması üzerinde çalışıyorum. Bu bizim app tüm boyunca serpilir ettik anlamına gelir:

@login_required
def view(...):

Sorun yok, iyi çalışıyorher yerde onu eklemeyi unutmadığımız sürece! Ne yazık ki bazen unutuyoruz, ve başarısızlık genellikle çok belirgin değil. Eğer bir görünüm için tek link @login_required bir sayfada ise, o zaman aslında giriş yapmadan bu görüşü ulaşabilirsiniz dikkat edin olası değil. Ama kötü adamlar bir sorun olduğu fark olabilir.

Benim fikrim bu sistemi tersine çevirmek için. Yazın @login_required her yerde sahip olmak yerine, yerine gibi bir şey olurdu:

@public
def public_view(...):

Sadece ortak şeyler için. Bazı katman ile bunu uygulamak için denedim ve işe almak gibi olamaz. Denedim herşeyin kötüye kullanıyoruz diğer katman ile etkileşim, sanırım. Bir şey yazmaya gez @olmayan her şey kamu azından @login_required işaretli olduğunu kontrol etmek için URL desenleri çalıştım sonraki zaman bir şey unuttuk eğer hızlı bir hata alırdık. Ama sonra @login_required bir görünüm için uygulanmış olsaydı sana nasıl çözemedim...

Bunu yapmak için doğru yolu nedir? Yardım için teşekkürler!

CEVAP
29 Ocak 2010, Cuma


Katman en iyi bahis olabilir. Bir parçacık başka bir yerde bulunan modifiye geçmişte bu kod parçası kullandım:

import re

from django.conf import settings
from django.contrib.auth.decorators import login_required


class RequireLoginMiddleware(object):
    """
    Middleware component that wraps the login_required decorator around
    matching URL patterns. To use, add the class to MIDDLEWARE_CLASSES and
    define LOGIN_REQUIRED_URLS and LOGIN_REQUIRED_URLS_EXCEPTIONS in your
    settings.py. For example:
    ------
    LOGIN_REQUIRED_URLS = (
        r'/topsecret/(.*)$',
    )
    LOGIN_REQUIRED_URLS_EXCEPTIONS = (
        r'/topsecret/login(.*)$',
        r'/topsecret/logout(.*)$',
    )
    ------
    LOGIN_REQUIRED_URLS is where you define URL patterns; each pattern must
    be a valid regex.

    LOGIN_REQUIRED_URLS_EXCEPTIONS is, conversely, where you explicitly
    define any exceptions (like login and logout URLs).
    """
    def __init__(self):
        self.required = tuple(re.compile(url) for url in settings.LOGIN_REQUIRED_URLS)
        self.exceptions = tuple(re.compile(url) for url in settings.LOGIN_REQUIRED_URLS_EXCEPTIONS)

    def process_view(self, request, view_func, view_args, view_kwargs):
        # No need to process URLs if user already logged in
        if request.user.is_authenticated():
            return None

        # An exception match should immediately return None
        for url in self.exceptions:
            if url.match(request.path):
                return None

        # Requests matching a restricted URL pattern are returned
        # wrapped with the login_required decorator
        for url in self.required:
            if url.match(request.path):
                return login_required(view_func)(request, *view_args, **view_kwargs)

        # Explicitly return None for all non-matching requests
        return None

Settings.py liste baz korumak istediğini URL:

LOGIN_REQUIRED_URLS = (
    r'/private_stuff/(.*)$',
    r'/login_required/(.*)$',
)

Sitenize sayfa kimlik doğrulaması gerektiren URL kuralları takip sürece, bu model çalışır. Eğer bu bire bir uygun değil ise, katman koşullarınıza uyacak şekilde değiştirmek daha yakından seçebilirsiniz.

Bu yaklaşım hakkında ne gibi - @login_required dekoratörler ile bulunanla çöp gerekliliğini kaldırarak yanı sıra, eğer kimlik doğrulama düzeni değişirse, gitmek için bir yer genel değişiklikler yapmak zorunda.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • ravinderosahn

    ravinderosah

    20 Temmuz 2009
  • Thom Hall

    Thom Hall

    24 Kasım 2006