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
  • 相关阅读:
    Highlighting Scatter Charts in Power BI using DAX
    在 Visio 中创建组织结构图
    Power BI Desktop 2020年7月功能摘要
    Power BI Calculation Group
    Vue中的路由以及ajax
    Vue的基本语法和常用指令
    洛谷P1525关押罪犯
    洛谷P2411 【[USACO07FEB]Silver Lilypad Pond S】
    洛谷P1776 宝物筛选(二进制优化多重背包)
    P3275 [SCOI2011]糖果
  • 原文地址:https://www.cnblogs.com/libolun/p/14000505.html
Copyright © 2011-2022 走看看