zoukankan      html  css  js  c++  java
  • day92:flask:flask简介&基本运行&路由&HTTP请求和响应

    目录

    1.Flask简介

    2.关于使用flask之前的准备

    3.flask的基本运行

    4.flask加载配置

    5.传递路由参数(没有限定类型)

    6.传递路由参数(通过路由转换器限定路由参数的类型)

    7.自定义路由转换器

    8.路由限定请求方式

    9.注册路由和视图代码进行分离

    10.flask的HTTP请求

    11.flask的HTTP响应

    1.Flask简介

    Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。

    Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。

    其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。

    官网: https://flask.palletsprojects.com/en/1.1.x/

    官方文档: http://docs.jinkan.org/docs/flask/

    Flask常用第三方扩展包

    • Flask-SQLalchemy:操作数据库,ORM;

    • Flask-script:终端脚本工具,脚手架;

    • Flask-migrate:管理迁移数据库;

    • Flask-Session:Session存储方式指定;

    • Flask-WTF:表单;

    • Flask-Mail:邮件;

    • Flask-Bable:提供国际化和本地化支持,翻译;

    • Flask-Login:认证用户状态;

    • Flask-OpenID:认证, OAuth;

    • Flask-RESTful:开发REST API的工具;

    • Flask JSON-RPC: 开发rpc远程服务[过程]调用

    • Flask-Bootstrap:集成前端Twitter Bootstrap框架

    • Flask-Moment:本地化日期和时间

    • Flask-Admin:简单而可扩展的管理接口的框架

    可以通过 https://pypi.org/search/?c=Framework+%3A%3A+Flask 查看更多flask官方推荐的扩展

    2.关于使用flask之前的准备

    1.为flask单独安装一套虚拟环境

    mkvirtualenv flask -p python3

    2.在虚拟环境中安装flask

    pip install flask==0.12.5

    3.创建flask项目

    与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件

    例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境

    3.flask的基本运行

    from flask import Flask
    
    # 创建应用对象
    app = Flask(__name__)
    
    # 视图加载
    @app.route(rule="/") # 声明路由
    def index():    # 声明视图函数
        return "<h1>python31</h1>"  # 直接通过return返回普通字符串
    
    if __name__ == '__main__':
        # 启动项目,不要在run 后面写任何代码,不会被执行到
        app.run(debug=True, port=8000,host="0.0.0.0") # wsgiref模块提供的

    4.flask加载配置

    from flask import Flask
    
    app = Flask(__name__)
    
    # 配置类
    class Config():
        DEBUG = True # 开启调试模式
    
    # 通过app.config来加载配置
    app.config.from_object(Config)
    
    
    @app.route(rule="/") 
    def index():    
        return "<h1>python31</h1>" 
    
    
    if __name__ == '__main__':
        app.run(port=8000,host="0.0.0.0")

    5.传递路由参数(没有限定类型)

    from flask import Flask
    
    app = Flask(__name__)
    
    class Config():
        DEBUG = True
    
    app.config.from_object(Config)
    
    
    # 路由: 一种访问地址[url]和应用程序[视图]进行一对一绑定的映射关系
    # 往往在开发中,我们所说的路由,其实通常指代完成路由绑定关系的路由类
    @app.route(rule="/user/<user_id>-<mobile>") # 可以指定一个或多个参数进行传递
    def index(user_id,mobile): # 这里的参数名称必须和路由上面的保持一致。
        return "user_id=%s,mobile=%s" % (user_id,mobile)
    
    
    if __name__ == '__main__':
        app.run() 

    6.传递路由参数(通过路由转换器限定路由参数的类型)

    from flask import Flask
    
    app = Flask(__name__)
    
    class Config():
        DEBUG = True
    
    app.config.from_object(Config)
    
    # 路由转换器对路由参数的类型进行限定
    @app.route(rule="/<float:user_id>")
    def index(user_id):
        print(type(user_id))  # <class 'float'>
        return "user_id=%s" % user_id
    
    
    if __name__ == '__main__':
        app.run()

    7.自定义路由转换器

    from flask import Flask
    
    app = Flask(__name__)
    
    class Config():
        DEBUG = True
    
    app.config.from_object(Config)
    
    
    # 自定义路由转换器
    # 1. 声明的路由转换器类必须直接或间接继承于BaseConverter
    from werkzeug.routing import BaseConverter
    class MobileConverter(BaseConverter):
        # 2. 必须在初始化中调用父类对象进行初始化
        def __init__(self,*args,**kwargs):
            # 3. regex必须有参数
            self.regex = r"1[3-9]d{9}"
            super().__init__(*args,**kwargs)
    
    # 4. 注册你自己定义的路由转换器
    # app.url_map.converters["使用别名"] = 转换器类名
    app.url_map.converters["mob"] = MobileConverter
    
    @app.route(rule="/<mob:user_id>")
    def index(user_id):
        print(type(user_id))  # <class 'float'>
        return "user_id=%s" % user_id
    
    if __name__ == '__main__':
        app.run()

    8.路由限定请求方式

    from flask import Flask
    
    app = Flask(__name__)
    
    # 路由转换器对路由参数的类型进行限定
    '''@app.route(rule="/",methods=["POST","PUT","PATCH","DELETE"])'''
    @app.route(rule="/") # 没有填写第二个参数methods则默认只能通过get请求访问
    def index():
        return "ok"
    
    if __name__ == '__main__':
        app.run(debug=True)

    9.注册路由和视图代码进行分离

    from flask import Flask
    
    app = Flask(__name__)
    
    def index():
        return "ok"
    
    # 也可以让路由注册和视图进行分离
    app.add_url_rule(rule="/",view_func=index)
    
    if __name__ == '__main__':
        app.run(debug=True)

    10.flask的HTTP请求

    文档: http://docs.jinkan.org/docs/flask/api.html#flask.request

    • request:flask中代表当前请求的 request 对象

    • 作用:在视图函数中取出本次请求数据

    • 导入from flask import request

    • 代码位置:from flask.app import Request

    常用的属性如下:

    属性说明类型
    data 记录请求体的数据,并转换为字符串<br>只要是通过其他属性无法识别转换的请求体数据<br>最终都是保留到data属性中 bytes类型
    form 记录请求中的html表单数据 MultiDict
    args 记录请求中的查询字符串,也可以是query_string MultiDict
    cookies 记录请求中的cookie信息 Dict
    headers 记录请求中的请求头 EnvironHeaders
    method 记录请求使用的HTTP方法 GET/POST
    url 记录请求的URL地址 string
    files 记录请求上传的文件列表 *
    json 记录ajax请求的json数据 json

     

    1.request.form

    from flask import Flask,request
    from werkzeug.datastructures import ImmutableMultiDict
    
    app = Flask(__name__)
    
    @app.route("/form",methods=["POST","PUT","PATCH"])
    def get_form():
        print(request) # HTTP请求处理对象
        
        # 接受post提交表单数据
        print(request.form)
        """打印效果:
        ImmutableMultiDict([('username', 'xiaoming'), ('password', '123456'), ('lve', 'swimming'), ('lve', 'game'), ('lve', 'shopping')])
        # ImmutableMultiDict 这个类就是一个字典的子类,我们可以称之为类字典对象,所以可以通过字典的操作来使用。
        # 思路来源: from collection import OrderedDict
        """
        
        # 获取指定键的单个值
        print(request.form.get("username"))
        print(request.form["username"]) # 和上面的一样,没有区别
    
        print(request.form["lve"]) # 如果键对应的数据有多个值,则不能通过get或中括号
    
        # 获取指定键获取多个值
        print(request.form.getlist("lve")) # ['swimming', 'game', 'shopping']
    
        # 格式转换:to_dict()
        # ImmutableMultiDict 转换成基本格式
        # 注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值
        ret = request.form.to_dict() # {'username': 'xiaoming', 'password': '123456', 'lve': 'swimming'}
        
        return "ok"
    
    if __name__ == '__main__':
        app.run(debug=True)

    2.request.其他

    from flask import Flask,request
    from werkzeug.datastructures import ImmutableMultiDict
    
    app = Flask(__name__)
    
    @app.route("/query")
    def get_query_params():
        """获取查询字符串 query_params"""
        """127.0.0.1:5000/?username=xiaoming&age=18"""
        print(request.args)
        """打印效果:
        ImmutableMultiDict([('username', 'xiaoming'), ('age', '18')])
        """
        print(request.args.to_dict()) # {'username': 'xiaoming', 'age': '18'}
        return "ok"
    
    @app.route("/head")
    def get_head():
        """获取请求头数据"""
        print(request.headers)
        print(request.headers["Content-Type"]) # application/x-www-form-urlencoded
    
        # 获取自定义请求头[首字母大写,不支持多个单词使用横杠进行拼接的写法,也不支持多字节字符]
        print(request.headers["Company"]) # oldboyedu
        return "ok"
    
    @app.route("/",methods=["POST","GET"])
    def index():
        print(request.method) # GET 获取本次客户端的请求方法名
        print(request.url) # http://127.0.0.1:5000/  url地址
        print(request.json) # {'pay_type': 1, 'credit': 0, 'coupon': 0} 获取json数据
    
        print(request.files) # ImmutableMultiDict([('video1', <FileStorage: 'demo.mp4' ('video/mp4')>)])
        print(request.files.get("video1"))
        return "ok"
    
    if __name__ == '__main__':
        app.run(debug=True)

    11.flask的HTTP响应

    flask默认支持2种响应方式:

    数据响应: 默认响应html文本,也可以返回 JSON格式,或其他格式

    页面响应: 重定向

    ​url_for 视图之间的跳转

    响应的时候,flask也支持自定义http响应状态码

    1.响应html文本

    from flask import Flask,request,make_response,Response,jsonify
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        """返回html数据"""
    
        '''这三种形式一模一样'''
        # return "<h1>hello user</h1>"
        # return make_response("<h1>hello user</h1>") # 上面的代码是这段代码的简写
        # return Response("<h1>hello user</h1>") # 上面make_response本质上就是Response

    2.响应json数据

    from flask import Flask,request,make_response,Response,jsonify
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        
        """返回json格式数据"""
        # data = {"name":"xiaoming","age":13}
        return make_response(jsonify(data))
        return jsonify(data) # 两种方式都可以响应json数据

    3.重定向redirect

    from flask import redirect
    # 页面跳转响应
    @app.route("/user")
    def user():
        # 页面跳转 redirect函数就是response对象的页面跳转的封装
        return redirect("http://www.baidu.com")

    4.重定向到自己写的视图函数:url_for

    from flask import Flask,redirect,url_for
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index():
        return "index"
    
    
    # 转内跳转,进行视图之间的跳转
    @app.route("/")
    def home():
        # 视图之间的跳转
        return redirect(url_for("index",name="xiaoming"))
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    5.自定义状态码和响应头

    @app.route('/demo4')
    def demo4():
        return '状态码为 666', 400
      
    """还可以使用make_response创建Response对象,然后通过response对象返回数据"""
    from flask import make_response
    @app.route("/rep")
    def index7():
        response = make_response("ok")
        print(response)
        response.headers["Company"] = "oldboy" # 自定义响应头
        response.status_code = 201 # 自定义响应状态码
        return response
  • 相关阅读:
    SAP PI 如何实现消息定义查询
    EWM与ERP交互程序
    ITS Mobile Template interpretation failed. Template does not exist
    SAP Material Flow System (MFS) 物料流系统简介
    SAP EWM Table list
    EWM RF 屏幕增强
    SAP EWM TCODE list
    SAP扩展仓库管理(SAPEWM)在线研讨会笔记
    ERP与EWM集成配置ERP端组织架构(二)
    EWM RF(Radio Frequency)简介
  • 原文地址:https://www.cnblogs.com/libolun/p/14000505.html
Copyright © 2011-2022 走看看