2016-12-25 8 views
1

У меня есть приложение третьей стороны, что я в том числе в мое приложение:Django Url фильтрации

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. Как мне это сделать? Если я просто включу URL-адреса приложения телеграммы, тогда запросы с другими будут приняты в моем приложении, что вызовет проблемы.

+0

Хотя я его не тестировал, я думаю, вы можете написать собственное промежуточное программное обеспечение, чтобы проверить URL-адрес и поднять 404, если вы не хотите что-либо менять в представлениях. –

+0

Я не хочу поднимать 404, потому что возможно, что в моем проекте работает много приложений, и каждое приложение обрабатывает запросы для другого бота. Поэтому я просто хочу, чтобы каждое приложение обрабатывало запросы, отправляемые их ботам (каждый бот имеет свой токен). Чтобы быть точным, я не хочу, чтобы приложение получало запрос, который не от его бота (или жетона) – Ken

ответ

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!

+0

Большое спасибо, я попробую это – Ken