flask 路由 add_url_rule 、@app.route app.test_request_context()
2026/4/17 17:41:10 网站建设 项目流程

fromflaskimportFlask app=Flask(__name__)defhello():return"Hello, World!"# 注册路由app.add_url_rule('/','hello',hello)# 等价于:# @app.route('/')# def hello():# return "Hello, World!"# 带变量的路由defuser_profile(username):returnf"用户:{username}"app.add_url_rule('/user/<username>','user_profile',user_profile)# 带类型转换器defpost_detail(post_id):returnf"文章ID:{post_id}"app.add_url_rule('/post/<int:post_id>','post_detail',post_detail)# 指定 请求方式的defuser_list():ifrequest.method=='GET':return"获取用户列表"elifrequest.method=='POST':return"创建新用户"app.add_url_rule('/users','user_list',user_list,methods=['GET','POST'])# 等价于:# @app.route('/users', methods=['GET', 'POST'])# def user_list():# ...

app.test_request_context()返回一个请求上下文对象(RequestContext),它模拟一个 HTTP 请求环境,让你可以在没有实际请求的情况下使用 Flask 的请求相关功能。fromflaskimportFlask,url_for,request,session app=Flask(__name__)# 调用 test_request_context() 返回一个上下文对象ctx=app.test_request_context()print(type(ctx))# <class 'flask.ctx.RequestContext'># 在没有请求时使用 url_for()# ❌ 这样会报错(没有应用上下文)# url_for('index') # RuntimeError: Working outside of application context# ✅ 使用 test_request_contextwithapp.test_request_context():url=url_for('index')# 正常工作print(url)# /# 模拟请求数据(路径、参数、方法等)# 模拟 GET 请求,带查询参数withapp.test_request_context('/search?q=flask&page=2'):print(request.method)# GETprint(request.path)# /searchprint(request.args)# ImmutableMultiDict([('q', 'flask'), ('page', '2')])print(request.args.get('q'))# flask# 模拟 POST 请求,带表单数据withapp.test_request_context('/login',method='POST',data={'username':'admin','password':'123'}):print(request.method)# POSTprint(request.form)# ImmutableMultiDict([('username', 'admin'), ('password', '123')])print(request.form['username'])# admin# 模拟 JSON 数据withapp.test_request_context('/api',json={'name':'张三','age':20}):print(request.json)# {'name': '张三', 'age': 20}# 模拟携带请求头withapp.test_request_context('/',headers={'User-Agent':'Mozilla/5.0','X-Custom-Header':'test'}):print(request.headers.get('User-Agent'))# Mozilla/5.0print(request.headers.get('X-Custom-Header'))# test# 操作sessionwithapp.test_request_context():session['user_id']=123session['username']='admin'print(session.get('user_id'))# 123# 手动调用视图函数@app.route('/user/<int:user_id>')defuser_profile(user_id):returnf"User{user_id}"# 测试视图函数withapp.test_request_context('/user/42'):# 手动调用视图函数response=user_profile(42)print(response)# User 42# 测试需要请求数据的视图函数@app.route('/login',methods=['POST'])deflogin():username=request.form.get('username')password=request.form.get('password')ifusername=='admin'andpassword=='secret':session['user']=usernamereturn'登录成功'return'登录失败',401# 测试登录功能withapp.test_request_context('/login',method='POST',data={'username':'admin','password':'secret'}):response=login()print(response)# 登录成功print(session.get('user'))# admin

批量注册路由

》》使用列表批量注册路由

defindex():return"首页"defabout():return"关于"defcontact():return"联系我们"routes=[('/','index',index),('/about','about',about),('/contact','contact',contact),]forrule,endpoint,view_funcinroutes:app.add_url_rule(rule,endpoint,view_func)

》》》使用字典批量注册路由

routes_config={'/':{'endpoint':'home','view_func':index,'methods':['GET']},'/admin':{'endpoint':'admin','view_func':admin,'methods':['GET','POST']},}forrule,configinroutes_config.items():app.add_url_rule(rule,**config)# 在蓝图中使用fromflaskimportBlueprint admin=Blueprint('admin',__name__)defdashboard():return"管理后台"# 在蓝图上使用 add_url_ruleadmin.add_url_rule('/dashboard','dashboard',dashboard)# 注册蓝图app.register_blueprint(admin,url_prefix='/admin')# 根据条件注册路由defregister_debug_routes(app):"""仅在调试模式下注册的路由"""ifapp.debug:defdebug_info():return"调试信息"app.add_url_rule('/debug','debug_info',debug_info)register_debug_routes(app)# 动态添加路由(运行时)defdynamic_page(name):returnf"动态页面:{name}"# 运行时动态添加路由page_name="test"app.add_url_rule(f'/{page_name}',page_name,dynamic_page)# 甚至可以循环添加pages=['about','service','product']forpageinpages:defview_func(page=page):# 注意捕获变量returnf"这是{page}页面"app.add_url_rule(f'/{page}',page,view_func)

类视图的注册

fromflask.viewsimportViewclassUserView(View):defdispatch_request(self):return"用户页面"# 注册类视图app.add_url_rule('/users',view_func=UserView.as_view('user_list'))# MethodView 示例fromflask.viewsimportMethodViewclassUserAPI(MethodView):defget(self):return"获取用户"defpost(self):return"创建用户"app.add_url_rule('/api/users',view_func=UserAPI.as_view('user_api'))
# 它内部大致做了这些工作:defas_view(name):# 1. 创建一个闭包函数defview(**kwargs):# 2. 实例化 UserView 类instance=UserView()# 3. 调用 dispatch_request 方法returninstance.dispatch_request(**kwargs)# 4. 给这个函数起个名字(用于 endpoint)view.__name__=namereturnview# 返回一个真正的函数# ✅ 正确:通过 as_view 转换app.add_url_rule('/users',view_func=UserView.as_view('user_list'))# 相当于手动写了一个函数视图:defuser_list():returnUserView().dispatch_request()app.add_url_rule('/users',view_func=user_list)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询