Функции представления Flask
Функции представления — это основная часть приложения Flask; они обрабатывают запросы и генерируют ответы.
Функции представления тесно связаны с маршрутизацией: маршруты используются для сопоставления URL-адресов с конкретными функциями представления.
Далее следует подробное объяснение функций представления Flask, включая их определение, использование данных запроса, возврат ответов и обработку ошибок.
- Определение функции представления: Функции представления — это основная функциональность, которая обрабатывает запросы и возвращает ответы.
- Получение данных запроса: Использовать
requestИспользуйте объект для получения параметров URL, данных формы, параметров запроса и т. д. - Возврат ответа: Можно возвращать строки, HTML, JSON или пользовательские объекты ответа.
- Обработка запросов и ответов: Использовать
requestобъект иmake_responseИспользуется для обработки запросов и создания пользовательских ответов. - обработка ошибок: Обрабатывайте исключения внутри функций представления или используйте механизм обработки ошибок Flask.
- Декораторы для функций представления: Использовать
@app.before_request、@app.after_requestДекораторы обрабатывают логику до и после запросов. - Коды состояния, возвращаемые функциями представленияМожно указать коды состояния HTTP, чтобы указать результат обработки запроса.
1. Определение функций представления
Функция представления — это обычная функция Python, которая принимает запросы и возвращает ответы. Функции представления обычно используются вместе с маршрутами, сопоставляя URL-адреса с функциями представления через декораторы.
Пример
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, World!'
@app.route('/'): Сопоставить корневой URL/вhomeфункция представления.def home()Функция представления, возвращает строку'Hello, World!'в качестве ответа.
2. Получение данных запроса
Функции представления могут получать различные типы данных запроса, включая URL-параметры, данные формы, параметры запроса и т. д.
Получение URL-параметров:
Пример
def greet(name):
return f'Hello, {name}!'
<name>— это URL-параметр, передаваемый функции представления.greet。
Получение данных формы:
Пример
@app.route('/submit', methods=['POST'])
def submit():
username = request.form.get('username')
return f'Форма отправлена пользователем {username}!'
request.form.get('username'): Извлекает поле username из данных формы в POST-запросе.
Получение параметров запроса:
Пример
def search():
query = request.args.get('query')
return f'Результаты поиска для: {query}'
request.args.get('query'): Извлекает параметр запроса query из GET-запроса.
3. Возврат ответа
Функции представления могут возвращать несколько типов ответов, включая строки, HTML, JSON или пользовательские объекты ответа.
Возврат строки:
Пример
def message():
return 'Это простое сообщение.'
Возврат HTML-шаблонов:
Пример
@app.route('/hello/<name>')
def hello(name):
return render_template('hello.html', name=name)
render_template('hello.html', name=name)Отрендерить HTML-шаблон hello.html и передать переменную name в шаблон.
Возврат JSON-данных:
Пример
@app.route('/api/data')
def api_data():
data = {'key': 'value'}
return jsonify(data)
jsonify(data)Преобразует словарь Python в JSON-ответ.
Возврат пользовательских объектов ответа:
Пример
@app.route('/custom')
def custom_response():
response = Response('Custom response with headers', status=200)
response.headers['X-Custom-Header'] = 'Value'
return response
Response('Custom response with headers', status=200): Создайте пользовательский объект ответа и задайте заголовки ответа.
4. Обработка запросов и ответов
Функции представления могут получать доступ к объекту request и генерировать ответы на основе данных запроса. Вы можете использовать объект request для получения информации о запросе и make_response для создания пользовательских ответов.
Использование объекта request:
Пример
@app.route('/info')
def info():
user_agent = request.headers.get('User-Agent')
return f'Your user agent is {user_agent}'
request.headers.get('User-Agent'): Получить информацию User-Agent из заголовков запроса.
Используйте make_response:
Пример
@app.route('/header')
def custom_header():
response = make_response('Response with custom header')
response.headers['X-Custom-Header'] = 'Value'
return response
make_response('Response with custom header'): Создайте объект ответа и установите информацию о пользовательском заголовке.
5. Обработка ошибок
Исключения можно обрабатывать внутри функций представления, или ошибки можно обрабатывать с помощью механизма обработки ошибок Flask.
Обработка ошибок в функциях представления:
Пример
def divide(x, y):
try:
result = x / y
return f'Результат: {result}'
except ZeroDivisionError:
return 'Ошибка: деление на ноль', 400
Используйте оператор try-except для обработки ошибок деления на ноль и возврата пользовательского сообщения об ошибке и кода состояния.
Глобальная обработка ошибок:
Пример
def not_found(error):
return 'Page not found', 404
@app.errorhandler(404): Определите функцию, которая обрабатывает ошибки 404.
6. Декораторы для функций представления
Помимо @app.route, Flask также поддерживает другие декораторы для реализации более сложной функциональности.
Пример:
@app.before_requestФункции, которые выполняются перед обработкой каждого запроса.@app.after_requestФункции, которые выполняются после обработки каждого запроса.@app.teardown_requestФункции, которые выполняются после завершения запроса, используются для очистки.
Пример использования декоратора:
Пример
def before_request():
print('Before request')
@app.after_request
def after_request(response):
print('After request')
return response
@app.teardown_request
def teardown_request(exception):
print('Teardown request')
7. Коды состояния, возвращаемые функциями представления
Функции представления могут не только возвращать содержимое, но и указывать коды состояния HTTP.
Пример
def status():
return 'Всё в порядке', 200
Возврат кода состояния 200 означает успешный запрос.
Возвратите объект ответа с кодом состояния:
Пример
@app.route('/error')
def error():
return Response('Произошла ошибка', status=500)
Возврат кода состояния 500 означает внутреннюю ошибку сервера.
Другие расширения