Django Url过滤

时间:2016-12-25 17:46:15

标签: django url-routing django-urls

我有一个第三方应用,包含在我的应用中:

urlpatterns = [
    url(r'webhook/', include('telegram.urls', namespace='api_webhook')),
]

让我们说电报应用程序有这样的网址配置:

urlpatterns = [
    url(r'^(?P<token>[-_:a-zA-Z0-9]+)/$', TelegramView.as_view(), name='api_webhook'),
]

现在我想这样做,token参数只是我自己的标记。我们假设我有一个令牌jbhgfjkljnmbvgcfhjbmnbv,那么我只想接受<mysite>.com/webhook/jbhgfjkljnmbvgcfhjbmnbv的请求。我该怎么做呢? 如果我只是包含电报应用程序的网址,那么我的应用程序将接受与其他人的请求,这将导致问题。

1 个答案:

答案 0 :(得分:1)

如果这只是一个视图,您可以创建自己的视图并调用它:

from other_app.views import other_view

def is_valid(token):
    """Your token validation logic here."""
    return token == "XYZZY" 

def my_view(request, token):
    if not is_valid(token):
        return  HttpResponseForbidden("Bad token")
    return other_view(token)

如果您需要检查应用中的所有观看次数,请创建一个小middleware

def is_valid(token):
    return token == "XYZZY"


class CheckTokenMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        if request.resolver_match.namespace == "api_webhook":
            if not is_valid(view_kwargs.get('token')):
                return HttpResponseForbidden("bad token")

        return None

请务必将此添加到settings.MIDDLEWARE