【问题标题】:Django Url filteringDjango 网址过滤
【发布时间】:2016-12-25 17:46:15
【问题描述】:

我的应用中包含了第三方应用:

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,那么我只想接受对&lt;mysite&gt;.com/webhook/jbhgfjkljnmbvgcfhjbmnbv 的请求。我该怎么做呢? 如果我只包含电报应用程序的网址,那么我的应用程序将接受与其他人的请求,这将导致问题。

【问题讨论】:

  • 虽然我没有测试过,但我认为你可以编写一个自定义中间件来检查 url,如果你不想更改视图中的任何内容,可以在此处引发 404。
  • 我不想引发 404,因为我的项目中可能正在运行许多应用程序,并且每个应用程序都处理不同机器人的请求。所以我只想让每个应用程序只处理发送到他们的机器人的请求(每个机器人都有它的令牌)。准确地说,我不希望应用接收不是来自其机器人(或令牌)的请求

标签: django url-routing django-urls


【解决方案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!

【讨论】:

  • 非常感谢,我会试试的
猜你喜欢
  • 2017-01-13
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多