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
!
我有一个第三方应用程序,我将其包含在我的应用程序中:
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
!