Проверка URL Джанго - PullRequest
       2

Проверка URL Джанго

2 голосов
/ 03 июня 2011

HI,

Я хочу проверить свои URL-адреса, независимо от того, публикуются они или получаются с заботой о правильных данных. Поэтому я хочу проверить эти URL-адреса, прежде чем они вызовут соответствующие представления. Итак, я хочу написатькакое-то промежуточное программное обеспечение между представлением и URL-адресами, чтобы я мог обеспечить безопасность системы. Я не знаю, как передать данные через код промежуточного программного обеспечения для просмотра. В промежуточном программном обеспечении я напишу код unittest. который будет проверять URL-адреса, если они действительнызатем перейдем к соответствующему представлению, что другие мудрые с радостью скажут 404. Так может любой приятель подсказать мне, как мне вести дело. Или, может быть, это еще один альтернативный лучший способ сделать эту проверку.

Спасибо всем.

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Вы действительно должны проверять тип запроса в своих представлениях, а не в промежуточном программном обеспечении. Как я уже упоминал в комментариях выше, вы не можете определить, является ли запрос сообщением POST только из URL, не говоря уже о том, какие данные POST он несет.

Проверка типа запроса в представлении очень проста - просто проверьте, что request.method равно "GET" или "POST".

Если вы делаете это часто, кратчайшим путем будет создание декоратора, который сделает эту проверку за вас. Например, следующий декоратор проверяет, использовался ли запрос GET для вызова этого представления, или же возвращает объект HttpResponseBadRequest (код состояния 400):

# untested code, use with care
def require_GET(view_func):
    def wrap(request, *args, **kwargs):
        if request.method != "GET":
            return HttpResponseBadRequest("Expecting GET request")
        return view_func(request, *args, **kwargs)
    wrap.__doc__ = view_func.__doc__
    wrap.__dict__ = view_func.__dict__
    wrap.__name__ = view_func.__name__
    return wrap

Затем вы можете просто добавить к своей функции просмотра @require_GET, и проверка будет выполнена, когда вызывается представление. Э.Г.

@require_GET
def your_view(request):
    # ...

Вы можете сделать то же самое для POST.

Вот пример декоратора, проверяющего запрос POST, который принимает необязательный список полей, которые должны быть предоставлены с запросом POST.

# again, untested so use with care.
def require_POST(view_func, required_fields=None):
    def wrap(request, *args, **kwargs):
        if request.method != "POST":
            return HttpResponseBadRequest("Expecting POST request")
        if required_fields:
            for f in required_fields:
                if f not in request.POST:
                    return HttpResponseBadRequest("Expecting field %s" % f)
        return view_func(request, *args, **kwargs)
    wrap.__doc__ = view_func.__doc__
    wrap.__dict__ = view_func.__dict__
    wrap.__name__ = view_func.__name__
    return wrap

Используйте вот так:

@require_POST
def another_view(request):
    # ...

или

@require_POST(required_fields=("username", "password"))
def custom_login_view(request):
    # ...

Обновление

ОК, мой плохой. Я только что заново изобрел колесо.

Django уже предоставляет декораторы @require_GET и @require_POST. См. django.views.decorators.http .

1 голос
/ 03 июня 2011

Как говорили другие, вы должны делать это, по вашему мнению, или, может быть, вы должны сказать, что вы пытаетесь сделать для лучшего ...

В любом случае, вы не можете создать объект ответа в process_request , вы можете только добавлять переменные или изменять переменные в связанном запросе, например, переменную sessionid , используемую django или любую такая вещь ... или обновить любые существующие переменные запроса ...

Итак, вы должны использовать process_view, который запускается после process_request и непосредственно перед выполнением связанной с вами функции представления. Поскольку у вас есть объект запроса под рукой, вы можете проверить данные GET или POST, используя request.GET или request.POST .

Для этого вы должны добавить свой средний класс в MIDDLEWARE_CLASSES в settings.py и написать правильную функцию промежуточного программного обеспечения process_view . Для написания промежуточного программного обеспечения см. документацию по промежуточному программному обеспечению и проверьте существующие промежуточные программы django. Или скажи мне, что ты собираешься делать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...