Django Url 过滤

Django Url filtering

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

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

假设电报应用有这样的url配置:

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

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

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

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