我正在Django中部署一个多域平台,使用一些模型逻辑来执行网站之间的重定向。
由于重定向映射将变得稍微笨重,我宁愿装饰每个视图,而不是在每个视图中复制重定向代码(在这个项目中,我坚持使用基于函数的视图)。因为逻辑也可能被改变,我需要把它都放在一个地方,我真的很想为此使用一个自定义装饰器。
我一直在尝试不同的语法来定义一个装饰器,我得到各种各样的问题。https://pythonbasics.org/decorators/我正在使用这里看到的语法,但一开始我无法将其应用于Django视图。我用的是Django 3.2。这是线程,最类似于我的情况,这有助于我更接近的结果,我想Django自定义装饰器重定向问题,但我的装饰器视图仍然返回None,而不是一个HttpResponse对象,我不明白。
装饰1
def inner(request, *args, **kwargs):
print("DEBUGGING")
if settings.DEBUG == False or request.user.is_superuser == False:
return render(request, 'myapp/manutenzione.html')
func(request, *args, **kwargs)
return inner
装饰2我的重定向
def reindirizzamenti_necessari(func):
def inner(request, *args, **kwargs):
print("REINDIRIZZAMENTI")
sito = get_current_site(request)
dominio = sito.domain
if dominio[0:4] == "www.":
dominio = dominio.split("www.")[1]
try:
dominio = Dominio.objects.get(dominio = dominio)
sito_generale = False
# Redirect to the main domain
if not dominio.principale:
redirect_necessario = True
url = '/redirect/' + dominio.città.nome.lower()
return redirect(url)
context['luogo'] = dominio.città
except:
print("DOMINIO GENERALE")
if dominio.endswith(".it"):
return redirect("https://www.mymaindomainname.com") #not using this now, just moving forward to func()
func(request, *args, **kwargs) # <---- I THINK THIS IS WHAT IS NOT WORKING (from checking the prints, I get this last one)
return inner
我的装饰视图
@debugging
@reindirizzamenti_necessari
def homepage(request):
context = {}
return render(request, 'myapp/index.html', context)
当前重定向视图
def redirect_domain(request, city):
città_url = City.objects.get(nome = city)
dominio_principale_città = Dominio.objects.get(città = città_url, principale = True)
url_finale = "https://" + dominio_principale_città.dominio
return redirect(url_finale)
当我调用"首页"时现在我得到
ValueError at /my-path
The view myapp.views.inner didn't return an HttpResponse object. It returned None instead.
在我看来,您应该使用中间件而不是装饰器。
https://docs.djangoproject.com/en/3.2/topics/http/middleware/流程视图