flask框架基本使用

flask框架基本使用Flask 可以搭建轻量服务 api 而且使用 python 语言编写程序 非常方便 以前也使用过 php 做服务器后端 但是不喜欢 php 的 而且我想多学学 python 没想到 Flask 框架恰好能满足我的需求 简直是一个神器 特别适合我这种非计算机专业人士学习 能快速搭建 api 为前端 web 微信小程序等提供 api 服务 非常 nice 爱了爱了


?前言

官方文档:Flask Document

Flask可以搭建轻量服务api,而且使用python语言编写程序,非常方便。以前也使用过php做服务器后端,但是不喜欢php的$,而且我想多学学python,没想到Flask框架恰好能满足我的需求,简直是一个神器!特别适合我这种非计算机专业人士学习,能快速搭建api,为前端web、微信小程序等提供api服务,非常nice,爱了爱了


?安装

pip3 install Flask 

?导入

from flask import Flask,request 

?Hello World

1、flask项目文件目录

project/ app/ # 整个程序的包目录 static/ # 静态资源文件 js/ # JS脚本 css/ # 样式表 img/ # 图片 favicon.ico # 网站图标 templates/ # 模板文件 common/ # 通用模板 errors/ # 错误页面 user/ # 用户模板 posts/ # 帖子模板 email/ # 邮件发送 views/ # 视图文件 models/ # 数据模型 libs/ #工具类 framework/ #全局性的工具 utils/ #小工具 extensions/ # 各种扩展 forms/ # 表单文件 main.py # 邮件发送 migrations/ # 数据库迁移目录 tests/ # 测试单元 venv/ # 虚拟环境 requirements.txt # 依赖包的列表 config.py # 配置文件 manage.py # 项目启动控制文件 

2、python文件内容示例

from flask import Flask app = Flask(__name__) # 实例化类flask @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() # 默认运行在5000端口 

?路由处理

def index(): ... app.add_url_rule("/", view_func=index) 

第三种是把不同的URL映射到同一个函数里,就是在函数前用多个@app.route(' ')

?配置

1、修改app文件名,文件夹路径

在app实例化的时候设置

app = Flask("my-app", static_folder="path1", template_folder="path2") 

2、开启项目调试模式

app.run(debug=True) 

3、设置app运行的端口并开启调试

注意:如果在开发环境中debug,要在app.run前加上

app.env="development" 

否则,会出现WARNING: This is a development server. Do not use it in a production deployment.

app.run(host='0.0.0.0', port=80, debug=True) 

?Request

flask中的request类专门用于对请求的参数进行处理,比如获得get请求参数,获得post请求参数。

必须要导入flask的request,这里导入的是全局变量(全局变量写代码量少,快速方便)

from flask import request 

常用属性:

属性 描述
method 请求方法,比如POST、GET。值为字符串,有“GET”,“POST”等
form 处理POST和PUT请求
args 处理GET参数
cookies 请求的cookies,类型是dict。
headers 请求头,字典类型。
data 包含了请求的数据,并转换为字符串,除非是一个Flask无法处理的mimetype。
files MultiDict,带有通过POST或PUT请求上传的文件。
path 获取请求文件路径:/myapplication/page.html
url_root 获取域名:http://www.baidu.com/
base_url 获取基本url:http://www.baidu.com/myapplication/page.html
url 获取全部url:http://www.baidu.com/myapplication/page.html?id=1&edit=edit
json 如果mimetype是application/json,这个参数将会解析JSON数据,如果不是则返回None。
stream 处理流
remote_addr 获取请求ip

1、处理GET请求

request.args.__str__() :列出所有参数
request.args.get('') :取出指定参数的第一个参数(如果有好多的话)
request.args.getlist('') :取出指定参数列表





2、处理POST请求

request.form.get("") 

3、处理表单数据

@app.route('/api',methods=['GET','POST']) def api(): #以下两行是展示form中处理文件以外的所有item # for item in request.form: # print(item) d1 = request.form.get("l1") d2 = request.form.get("l2") d3 = request.form.get("l3") file = request.files.get('file') print(file) dict = { 
            "code":"200","data":"处理完毕"} return jsonify(dict) 

4、处理JSON数据

request.json # 返回的是dict类型 

5、处理请求头参数

request.headers可以返回请求头参数。但是注意这是werkzeug.datastructures.EnvironHeaders对象。
想获取请求头的参数需要用get()方法:

request.headers.get("Host") 

? Response

flask接收到请求(request)后进行处理,处理完毕后会想客户端发送响应(response
flask的Response类是专门用于处理响应模块的。
使用导入两个:




from flask import make_response,Response @app.route("/test") def test(): response = Response("返回信息") # 或者这样:response = make_response('返回信息', 200, {"header1": "header1_info"}) response.status_code = 200 return response 

返回response最精简(懒人)模式:

 return "index.html", 200, { 
              "header1":"header1_info", "header2": "header2_info"} # 第一个参数是返回的信息,第二个是状态码,第三个是设置请求头(字典形式)。后两个参数可以省略 

补充:原则上我们返回(return)都应该是返回Response对象,但是上面的方式也是可以的,flask智能地将他们转为了Response对象。

常用属性:

属性 描述
headers 设置请求头信息
status String类型的数据,格式为这种:“200 ok”
status_code int 类型,就是状态码,但是不能是自定义的状态码
data 需要返回到前端的数据
set_cookie 设置cookie 的值
del_cookie 删除cookie ,不会立马删除cookie 值,会将过期时间设置为当前时间

构造函数: class flask.Response(response=None, status=None, headers=None, mimetype=None, content_type=None,direct_passthrough=False)

1、返回JSON数据

方案一 (返回JSON对象,并设置请求头)

from flask import Response return Response(json.dumps(text), mimetype='application/json') 

方案二(使用jsonify)

from flask import jsonify return jsonify(text) 

2、设置请求头

方案一:

@app.route("/test") def test(): rp = Response("返回信息") rp.headers['header1'] = "header1_info" # 设置响应头 rp.headers['header2'] = "header2_info" # 设置响应头 return rp 

方案二:

return "返回信息", 200, { 
              "header1":"header1_info", "header2": "header2_info"} 

方案三

return "返回信息", 200, [("header1", "header1_info"), ("header2", "header2_info")] # 使用元组的方式设 

?Cookie

读取cookie

name=request.cookies.get('Name') return name 

设置Cookie并返回

response.set_cookie('key','value',expires=None, path='/') return response 

expires设置时间,其中expires的格式:[str, datetime.datetime, int, float]


?Session

配置SECRET_KEY:

app.config["SECRET_KEY"]='XXXXX' # 密钥是24位字符串。可以使用os.urandom(24)来生成随机字符串 

session操作:

from flask import session session["key"]= ... # 设置session,也可以不赋值来返回值,无值会异常 session.get("key") # 如果没有key值,会返回NONE # 删除session session.pop('key') # 清除所有session session.clear 

?Token验证

1、安装并应用

pip install pyjwt 
import jwt 

2、生成token

auth = HTTPBasicAuth() # 密钥,可随意修改 SECRET_KEY = 'abcdefghijklmm' # 生成token, 有效时间为600min encoded = jwt.encode({ 
                 "some": "payload"}, SECRET_KEY, algorithm="HS256") def createToken(): payload = { 
                 "id": "此token指向的用户id", "iss": “crayonxin”,"nbf": time.time(), "exp": time.time()+} encoded = jwt.encode(payload, SECRET_KEY, algorithm="HS256") rp = Response(encoded) rp.set_cookie("token", encoded, expires=time.time()+) rp.headers["token"] = encoded return rp 

3、验证token

我自己封装了一个类,方便后期。

# 密钥,可随意修改 SECRET_KEY = 'abcdefghijklmm' class Verify(object): def __init__(self, key, headers: werkzeug.datastructures.EnvironHeaders): # hearders是请求头 self.headers = headers self.key = key def verifyToken(self): encoded = self.headers.get("token") try: jwt.decode(encoded, self.key, issuer="crayonxin", algorithms="HS256") except Exception as e: return False return True # 有没有错误都会返回信息 def DecodeToken(self): encoded = self.headers.get("token") if encoded == None: return "请求头没有token参数" try: dict = jwt.decode(encoded, self.key,issuer="crayonxin", algorithms="HS256") except jwt.ExpiredSignatureError: # 时间到期错误 return "时间到期" except jwt.InvalidSignatureError: # token验证失败 return "token验证失败" except jwt.InvalidIssuerError: # 颁发者错误 return "颁发者错误" return dict 

4、使用token

def get(): verify = Verify(SECRET_KEY, request.headers) if verify.verifyToken(): print("成功") # 这里写验证成功的程序 pass else: # 这里写验证失败的程序 print("失败") pass dict = verify.DecodeToken() return dict 

?CORS跨域处理

from flask_cors import * # 没有库请安装 app = Flask("name") CORS(app, supports_credentials=True) 

?返回http状态码

return “错误信息”,404 

或者使用abort()

from flask import abort abort(404) 

?重定向

from flask import redirect @app.route('') def index(): return redirect(location='',code=302) 

?Restful api

flask不用其他的扩展其实可以构建简单的api,但是写的多的时候,看起来很乱。

有一个非常好用的库叫flask_restful,这可以非常简单的部署api服务。

flask_restful官方文档

Restful api 安装

pip install flask-restful 

Restful api 示例

from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return { 
                     'hello': 'world'} def post(self): return { 
                     '':''} def delete(self, todo_id): del todo_id return '', 204 def put(self,param): return { 
                     } api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True) 

注意: 没有flask_restful这个工具的话,以前发送JSON需要使用Reponse类或者jsonify,现在直接返回字典,自动转换成JSON格式返回,太方便了!!!


?Flask返回图片

flask如果想返回图片,通用的处理方式是使用Base64编码,web接收到信息,使用html的img标签即可展示图片。
下面以使用matplot绘制图为例,展示flask返回图片

import base64 from io import BytesIO from flask import Flask from matplotlib.figure import Figure app = Flask(__name__) @app.route("/") def hello(): # 建立图板,不要用pyplot,会造成内存溢出 fig = Figure() ax = fig.subplots() ax.plot([1, 2]) # matplot图保存在io流 buf = BytesIO() fig.savefig(buf, format="png") # io流转为base64编码的字符串 data = base64.b64encode(buf.getbuffer()).decode("ascii") return f"data:image/png;base64,{ 
                        data}" # 返回图片字符串,html中img标签可以直接引用该字符串。 




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176778.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:04
下一篇 2026年3月26日 下午9:04


相关推荐

  • Adobe Illustrator怎么制作同心圆

    Adobe Illustrator怎么制作同心圆

    2026年3月19日
    2
  • Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本

    Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本首先是创建一个 Windows 定时任务 并且设置它每天执行一次指定的 Python 脚本参考以下两篇博客进行 Window 系统创建定时任务定时执行任务 Windows 定时任务执行 python 脚本文件 py 关于创建 Windows 定时任务执行 python 脚本 上面两篇博客的作者已经写得非常清楚了 但是我的需求是让该定时任务每隔 5 分钟执行一次 于是我在上面两篇博客的基础上进行了如下设置 1 首

    2026年3月18日
    2
  • 反射型xss解决方法,增加过滤器,防止反射型 XSS攻击漏洞

    反射型xss解决方法,增加过滤器,防止反射型 XSS攻击漏洞web.xml配置<filter> <filter-name>XSSFilter</filter-name> <filter-class>com.xxx.filter.NewXssFilter</filter-class> </filter> <filter-mapping> <filter-name>XSSFilter</filter-name> <url

    2022年5月7日
    38
  • tensorflow(gpu) win10安装 1060显卡驱动[通俗易懂]

    tensorflow(gpu) win10安装 1060显卡驱动[通俗易懂]CUDA9.0+cuDNNv7+WIN10+1060显卡一.驱动文件下载1.上tensorflow官网。查看本机硬件和系统支持的tensorflow版本,以及对应的cuda和cuddnn版本。https://www.tensorflow.org/install/install_windows?hl=zh-cn2.百度进CUDA网站。查找相应的CUDA驱动。打开默认下载是9.2版本,如下…

    2022年5月9日
    212
  • html5是什么意思,HTML5是什么 HTML5是什么意思?

    html5是什么意思,HTML5是什么 HTML5是什么意思?随着Windows8正式版发布的脚步近在咫尺,近来关于Win8、IE10、HTML5的新闻逐渐增多,很多朋友对于Win8系统以及IE10浏览器都比较了解,但对于HTML5是什么还真有不少朋友不清楚,很多媒体网站在报道IE10浏览器支持最新html5的时候,不少朋友还是一头雾水,以下电脑百事网小编为大家简单介绍下HTML5是什么。HTML5是什么HTML5是什么意思专业的说,HTML5是用于取代1…

    2025年7月11日
    7
  • Python的常用函数:append()

    Python的常用函数:append()1.描述append()函数用于在列表末尾添加新的对象。2.语法list.append(obj)其中:list:列表对象;obj:添加到列表末尾的对象。注意:append()函数无返回值,但是会修改原本的列表。3.示例list=[‘abc’,’Harden’,’python’,’Curry’,…

    2022年4月4日
    90

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号