flask框架基本使用

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

pip3 install Flask
from flask import Flask,request

1、flask项目文件目录

project/
    app/
        static/
            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__)

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

if __name__ == '__main__':
    app.run()
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)

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。filesMultiDict,带有通过POST或PUT请求上传的文件。path获取请求文件路径:/myapplication/page.htmlurl_root获取域名:http://www.baidu.com/base_url获取基本url:http://www.baidu.com/myapplication/page.htmlurl获取全部url:http://www.baidu.com/myapplication/page.html?id=1&edit=editjson如果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():

    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

5、处理请求头参数

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

request.headers.get("Host")

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

from flask import make_response,Response

@app.route("/test")
def test():
    response = Response("返回信息")

    response.status_code = 200
    return response

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

 return "index.html", 200, {"header1":"header1_info", "header2": "header2_info"}

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

常用属性:

属性描述headers设置请求头信息statusString类型的数据,格式为这种:”200 ok”status_codeint 类型,就是状态码,但是不能是自定义的状态码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"}

方案三

读取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本质上还是cookie,但是时效短。flask会发送session-id给客户端(数据临时存储在服务端),客户端只要不关闭浏览器,打开多个页面浏览器会自动发送session-id,服务端能读取id来处理数据。
session能够运行在服务器端并存储交互状态。Flask中的Session与其他的Web框架不同,它使用了密钥签名的方式进行了加密。

配置SECRET_KEY:

app.config["SECRET_KEY"]='XXXXX'

session操作:

from flask import session

session["key"]= ...

session.get("key")

session.pop('key')

session.clear

token验证技术的其中一种解决方案是JSON Web Token。这是目前最常用的token认证解决方法。关于JWT的解释可以看这篇文章:基于 Token 的身份验证:JSON Web Token
flask框架实现JWT token验证有好几个库,比如pyjwt,flask-jwt。我选择pyjwt,他的文档比较好。

1、安装并应用

pip install pyjwt
import jwt

2、生成token

auth = HTTPBasicAuth()

SECRET_KEY = 'abcdefghijklmm'

encoded = jwt.encode({"some": "payload"}, SECRET_KEY, algorithm="HS256")
def createToken():
    payload = {"id": "此token指向的用户id", "iss": "crayonxin","nbf": time.time(), "exp": time.time()+604800}
    encoded = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
    rp = Response(encoded)
    rp.set_cookie("token", encoded, expires=time.time()+604800)
    rp.headers["token"] = encoded
    return rp

我设置了过期时间为604800秒(一周的时间)。
我把token放到了cookie和自定义请求头token中。我放到cookie中是为了做web时好自动存储,省事。

3、验证token

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


SECRET_KEY = 'abcdefghijklmm'
class Verify(object):
    def __init__(self, key, headers: werkzeug.datastructures.EnvironHeaders):
        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:
            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
from flask_cors import *
app = Flask("name")
CORS(app,methods=["GET","POST","PUT","PATCH","DELETE","OPTIONS"], supports_credentials=True,expose_headers=['Content-Disposition'],)

CORS类的参数:

参数名类型Head字段解释resources字典、迭代器或字符串无全局配置允许跨域的API接口origins列表、字符串或正则表达式Access-Control-Allow-Origin配置允许跨域访问的源,*表示全部允许methods列表、字符串Access-Control-Allow-Methods配置跨域支持的请求方式,如:GET、POSTexpose_headers列表、字符串Access-Control-Expose-Headers自定义请求响应的Head信息,设置值之后,前端js能获取到响应头allow_headers列表、字符串或正则表达式Access-Control-Request-Headers配置允许跨域的请求头supports_credentials布尔值Access-Control-Allow-Credentials是否允许请求发送cookie

return "错误信息",404

或者使用 abort()

from flask import abort
abort(404)
from flask import redirect

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

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

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

restful api 不是技术,准确的说是一种规范。可以看这个介绍RESTful API接口设计标准及规范
一个链接代表一个资源,使用 [GET][POST][PUT][DELETE][PATCH]来对资源进行处理。

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如果想返回图片,通用的处理方式是使用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():

    fig = Figure()
    ax = fig.subplots()
    ax.plot([1, 2])

    buf = BytesIO()
    fig.savefig(buf, format="png")

    data = base64.b64encode(buf.getbuffer()).decode("ascii")
    return f"data:image/png;base64,{data}"

Original: https://blog.csdn.net/Crayonxin2000/article/details/122503208
Author: Crayon鑫
Title: flask框架基本使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/745732/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球