Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

Простая проверка данных

Наш пример с поиском всё ещё остаётся достаточно простым, особенно с точки зрения проверки передаваемых данных. Мы просто проверяем наличие информации в запросе. Множество HTML форм включают в себя значительно более сложные проверки. Все мы видели такие сообщения об ошибках на сайтах:

  • «Пожалуйста, введите верный адрес электронной почты. 'foo' не является адресом электронной почты.»

  • «Пожалуйста, введите верный шестизначный код почтового отделения. '123' не является почтовым кодом.»

  • «Пожалуйста, введите верную дату в формате DD-MM-YYYY.»

  • «Пожалуйста, введите пароль, который содержит как минимум 8 символов и содержит хотя бы одну цифру.»

Об использовании JavaScript для проверки данных

Хотя мы не рассказываем об этом, но вы можете использовать JavaScript для проверки данных на стороне клиента, прямо в браузере. Но помните, даже если вы это делаете, вы обязаны сделать проверку и на стороне сервера. Некоторые пользователи не включают JavaScript, а «злобные хакеры» могут передавать самостоятельно сформированные данные, которые не доступны JavaScript коду.

И вы ничего не можете с этим поделать, остаётся только всегда проверять данные, переданные пользователями, на стороне сервера (т.е., в ваших представлениях). Проверку с помощью JavaScript следует рассматривать как дополнительную удобную функциональность сайта, но не как замену основного механизма проверки.

Давайте доработаем наше представление search() так, чтобы оно проверяло переданную строку на превышение её длины в 20 символов. (Предположим для этого примера, что передача более длинной строки значительно замедлит скорость выполнения поиска.) Как мы можем это сделать? Самым простым способом будет внедрение логики прямо в представление, вот так:

def search(request):
    error = False
    if 'q' in request.GET:
        q = request.GET['q']
        if not q:
            error = True
        elif len(q) > 20:
            error = True
        else:
            books = Book.objects.filter(title__icontains=q)
            return render_to_response('search_results.html',
                {'books': books, 'query': q})
    return render_to_response('search_form.html',
        {'error': error})

Теперь, при попытки отослать запрос с длиной строки более 20 символов, вы получите сообщение об ошибке. Но это сообщение в search_form.html пока говорит «Please submit a search term.» и нам потребуется изменить его так, чтобы оно учитывало оба случая:

<html>
<head>
    <title>Search</title>
</head>
<body>
    {% if error %}
        <p style="color: red;">Please submit a search term 20 characters or shorter.</p>
    {% endif %}
    <form action="/search/" method="get">
        <input type="text" name="q">
        <input type="submit" value="Search">
    </form>
</body>
</html>

Есть что-то некрасивое в этом. Наше «универсальное» сообщение об ошибке может запутать. Как может сообщение для пустого запроса упоминать об ограничении размера строки запроса 20-ю символами? Сообщение об ошибке должно быть точное.

Проблема заключается в том, что мы используем обычное булево значение для error, а надо использовать список строк с сообщениями об ошибке. Вот так мы можем изменить код:

def search(request):
    errors = []
    if 'q' in request.GET:
        q = request.GET['q']
        if not q:
            errors.append('Enter a search term.')
        elif len(q) > 20:
            errors.append('Please enter at most 20 characters.')
        else:
            books = Book.objects.filter(title__icontains=q)
            return render_to_response('search_results.html',
                {'books': books, 'query': q})
    return render_to_response('search_form.html',
        {'errors': errors})

Затем, надо сделать небольшое исправление в search_form.html для того, чтобы учесть изменения в коде — в шаблон передаётся список error, а не булево значение:

<html>
<head>
    <title>Search</title>
</head>
<body>
    {% if errors %}
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}
    <form action="/search/" method="get">
        <input type="text" name="q">
        <input type="submit" value="Search">
    </form>
</body>
</html>


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID