'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
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.
{% '...' %uzanır} koşullu ya...
Nasıl varsayılan olarak phpstorm ekran...
C programı bir kaza yapmak için en kol...
Alan salt okunur yapmak için Nasıl dja...
HTML iç içe geçmiş bir liste yapmak iç...