Flask框架(1)-程序基本结构
1. 安装Flask
1.1 安装虚拟环境
1 2 3 4 | mkdir myproject cd myproject py - 3 - m venv venv #Linux系统: python3 -m venv venv |
1.2 激活虚拟环境
1 2 | venv\Scripts\activate #Linux中: . venv/bin/activate |
1.3 安装Flask
1 | (venv) D:\Tmp\myproject>pip install Flask |
2. 第一个Flask程序
1 2 3 4 5 6 7 8 9 10 | from flask import Flask app = Flask(__name__) @app .route( '/' ) def hello(): return 'hello world' if __name__ = = '__main__' : app.run() |
初始化:app = Flask(__name__)
Flask类只需要有个构造参数即主模块或包的名字,这个参数决定程序的根目录,以便找到相对于根目录的资源文件,这个大部分情况__name__就是所需要的值。
路由:@app.route('/')
处理函数和和URL的关系,Flask通过修饰器把函数注册为路由。访问http://localhost:5000就会调用index这个视图函数
访问:http://127.0.0.1:5000,页面即可得到hello world.
默认只能本机访问,可以修改端口和允许的主机:app.run(host = '0.0.0.0',port = 7777,debug = True )
3.上下文
Flask有程序上下文和请求两种上下文,Flask使用上下文把一些对象设置为在一个线程内全局可访问。
Flask在分发请求之前,激活或者说推送程序和请求上下文,请求处理完后进行删除。注意一定要激活才可以使用上下文。
4. 请求调度
查看URL和处理函数的映射关系:
这里有一个特殊的映射关系/static/<filename>,这是Flask添加的特殊路由,用于访问静态文件。url_for('static', username='js/test.js')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | from flask import Flask, url_for app = Flask(__name__) @app .route( '/' ) def index(): return 'index' @app .route( '/login' ) def login(): return 'login' @app .route( '/user/<username>' ) def profile(username): return '{}\'s profile' . format (username) with app.test_request_context(): print (url_for( 'index' )) print (url_for( 'login' )) print (url_for( 'login' , next = '/' )) print (url_for( 'profile' , username = 'John Doe' )) / / login / login? next = / / user / John % 20Doe |
5. 请求钩子
钩子用于处理请求之前或者之后,比如说请求开始前建立数据库连接,Flask支持下面四种钩子:
6. 响应
6.1 响应状态码
1 2 3 | @app .route( '/' ) def index(): return '<h1>Hello World!</h1>' , 400 |
6.2 返回respones对象
1 2 3 4 5 | @app .route( '/' ) def index(): response = app.make_response( '<h1>This document carries a cookie</h1>' ) response.set_cookie( 'name' , 'scott' ) return response |
6.3 重定向
1 2 3 4 5 6 | from flask import redirect app = Flask(__name__) @app .route( '/' ) def red(): return redirect( 'https://www.baidu.com' ) |
6.4 abort函数处理错误
1 2 3 4 | @app .route( '/login' ) def login(): abort( 401 ) this_is_never_executed() |
7. 渲染模板
从Python内部生成HTML并不好玩,而且实际上非常麻烦,因为您必须自行执行HTML转义以保持应用程序的安全。因为Flask 自动为你配置Jinja2模板引擎。
要呈现模板,您可以使用该render_template()
方法。您所要做的就是提供模板的名称以及想要作为关键字参数传递给模板引擎的变量。以下是如何呈现模板的简单示例:
1 2 3 4 5 6 | from flask import render_template @app .route( '/hello/' ) @app .route( '/hello/<name>' ) def hello(name = None ): return render_template( 'hello.html' , name = name) |
8. HTTP方法
根据不同的请求方法,执行不同的方法。
1 2 3 4 5 6 7 8 | from flask import request @app .route( '/login' , methods = [ 'GET' , 'POST' ]) def login(): if request.method = = 'POST' : return do_the_login() else : return show_the_login_form() |
9. request
1 2 3 4 5 6 7 8 9 10 11 12 | @app .route( '/login' , methods = [ 'POST' , 'GET' ]) def login(): error = None if request.method = = 'POST' : if valid_login(request.form[ 'username' ], request.form[ 'password' ]): return log_the_user_in(request.form[ 'username' ]) else : error = 'Invalid username/password' # the code below is executed if the request method # was GET or the credentials were invalid return render_template( 'login.html' , error = error) |
要访问在URL(?key=value
)中提交的参数,您可以使用 args
属性:
searchword = request.args.get('key', '')
10. 文件上传
1 2 3 4 5 6 7 8 9 | from flask import request from werkzeug.utils import secure_filename @app .route( '/upload' , methods = [ 'GET' , 'POST' ]) def upload_file(): if request.method = = 'POST' : f = request.files[ 'the_file' ] #尽可能以原名字命名,中文会被去掉 f.save( '/var/www/uploads/' + secure_filename(f.filename)) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了