我正在使用Django作为我的服务器,并且在我的单个Django安装中托管了多个域。
我目前正在查看我视图中的每个传入请求,以查看是否访问www.aaa.com或www.bbb.com。
我想将这个检查放在一个装饰器中,原因很明显,但到目前为止还没有实现这个功能。 :(
我的主页视图:
def index(request, value=None):
# Here I check the domain the user wants to visit.
if request.META['HTTP_HOST'] != "www.aaa.com":
raise Http404("Requested website is not availble on the server.")
# Code here
# Load HTML
return render(request, 'frontend/homepage.html'})
登录视图:
def login_view(request):
# Check the domain the user wants to visit.
if request.META['HTTP_HOST'] != "www.aaa.com":
raise Http404("Requested website is not availble on the server.")
# Code here
# Load HTML
return render(request, 'frontend/login.html')
我的装饰者尝试自动化http_host检查:
def checkClient(func):
def dosomething(request):
if request.META['HTTP_HOST'] != "www.aaa.com":
raise Http404("This domain is not hosted on this server.")
return request
return dosomething
所以我试着写我自己的装饰师,但它不起作用。 :(
答案 0 :(得分:3)
你非常接近。您的request
视图应该调用它正在装饰的函数dosomething
,而不是返回func
。
其次,内部函数dosomething
应该处理*args
和**kwargs
,以便您可以装饰采用位置和关键字参数的视图,
def checkClient(func):
def dosomething(request, *args, **kwargs):
if request.META['HTTP_HOST'] != "www.aaa.com":
raise Http404("This domain is not hosted on this server.")
return func(request, *args, **kwargs)
return dosomething