Django重定向的自定义装饰器



我正在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/流程视图

最新更新