2025-07-24
开发
00
请注意,本文编写于 134 天前,最后修改于 134 天前,其中某些信息可能已经过时。

目录

Flask框架入门教程
1. Flask框架简介
2. 环境搭建
3. 初始化Flask应用
4. 创建路由和视图
路由参数
HTTP方法
5. 模板渲染
渲染HTML模板
示例hello.html模板
6. 静态文件
7. 请求对象(Request)
获取URL参数
获取表单数据
获取JSON数据
8. 响应对象(Response)
9. Flask的会话和Cookie管理
设置Cookie
获取Cookie
使用Session
10. 权限路由
基本权限检查
用户角色管理
11. 运行Flask应用

Flask框架入门教程

1. Flask框架简介

Flask是一个轻量级的Python Web框架,基于Werkzeug和Jinja2,它旨在让Web应用程序的开发变得简单而快速。Flask没有过多的强制性约定,使得开发者可以自由选择工具和库来构建应用。

2. 环境搭建

安装Flask:

bash
pip install Flask

3. 初始化Flask应用

Flask应用的初始化非常简单,首先导入Flask类,并实例化一个Flask应用对象。

python
from flask import Flask app = Flask(__name__) if __name__ == "__main__": app.run(debug=True)
  • Flask(__name__): 创建Flask应用实例,__name__告诉Flask在哪里查找静态文件和模板。
  • app.run(debug=True): 启动Flask应用,debug=True开启调试模式,可以在代码修改后自动重启应用。

4. 创建路由和视图

Flask通过装饰器将URL和视图函数绑定在一起,最常用的装饰器是@app.route()

python
@app.route('/') def hello_world(): return 'Hello, World!'

路由参数

可以在路由中传递参数:

python
@app.route('/hello/<name>') def hello_name(name): return f'Hello, {name}!'

HTTP方法

默认情况下,Flask路由只处理GET请求。如果需要处理其他HTTP方法(如POST),可以通过methods参数指定。

python
@app.route('/submit', methods=['POST']) def submit_form(): return 'Form submitted!'

5. 模板渲染

Flask使用Jinja2模板引擎来渲染HTML模板。

渲染HTML模板

python
from flask import render_template @app.route('/hello/<name>') def hello_name(name): return render_template('hello.html', name=name)
  • render_template('hello.html', name=name)会加载hello.html模板并将变量name传入。

示例hello.html模板

html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello {{ name }}</title> </head> <body> <h1>Hello, {{ name }}!</h1> </body> </html>

6. 静态文件

Flask自动为静态文件(如CSS、JavaScript和图片)提供支持。静态文件通常存放在static文件夹中。

python
# 访问静态文件:/static/style.css

7. 请求对象(Request)

Flask通过request对象处理请求数据,获取URL参数、表单数据、JSON数据等。

获取URL参数

python
from flask import request @app.route('/user') def user(): user_id = request.args.get('id') # 获取URL参数,如/user?id=123 return f'User ID: {user_id}'

获取表单数据

python
@app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] return f'Username: {username}, Password: {password}'

获取JSON数据

python
@app.route('/api', methods=['POST']) def api(): data = request.get_json() # 获取JSON数据 return f'Received data: {data}'

8. 响应对象(Response)

Flask允许你创建自定义响应对象。

python
from flask import make_response @app.route('/custom_response') def custom_response(): response = make_response('Hello, Custom Response') response.headers['X-Custom-Header'] = 'Value' return response

9. Flask的会话和Cookie管理

Flask有内置的支持来管理Cookie和Session。

设置Cookie

python
from flask import make_response @app.route('/set_cookie') def set_cookie(): resp = make_response('Cookie Set') resp.set_cookie('username', 'admin') return resp

获取Cookie

python
from flask import request @app.route('/get_cookie') def get_cookie(): username = request.cookies.get('username') return f'Username from Cookie: {username}'

使用Session

Flask使用session对象来管理用户会话,默认情况下,Flask会话数据存储在加密的cookie中。

python
from flask import session app.secret_key = 'your_secret_key' # 设置密钥用于加密Session数据 @app.route('/set_session') def set_session(): session['user'] = 'admin' return 'Session Set' @app.route('/get_session') def get_session(): user = session.get('user', 'Guest') return f'Logged in as {user}'

10. 权限路由

Flask没有内建的权限控制机制,但可以通过Flask扩展或自定义装饰器来实现权限管理。

基本权限检查

创建一个装饰器来检查用户是否登录。

python
from functools import wraps from flask import redirect, url_for, session def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'user' not in session: return redirect(url_for('login')) return f(*args, **kwargs) return decorated_function

使用@login_required装饰器保护需要登录的视图:

python
@app.route('/dashboard') @login_required def dashboard(): return 'Welcome to the Dashboard'

用户角色管理

可以通过定义不同角色来限制某些路由的访问权限。

python
@app.route('/admin') @login_required def admin(): if session.get('role') != 'admin': return 'Access Denied', 403 return 'Welcome Admin'

11. 运行Flask应用

  • 测试环境中可以直接运行app.py文件

  • 生产环境中通常需要使用更强大的服务器(如Gunicorn、uWSGI)。

bash
# 使用Gunicorn运行 gunicorn -w 4 app:app

本文作者:晏秋

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!