Django创建自定义装饰器

时间:2015-11-02 16:16:45

标签: django decorator

我正在使用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

所以我试着写我自己的装饰师,但它不起作用。 :(

1 个答案:

答案 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