zoukankan      html  css  js  c++  java
  • flask框架基础语法

    安装

    pip3 install flask==0.12.5

    安装好之后提供了这几个模块:

    • Jinja2:模板引擎
    • MarkupSafe:编码转换工具(字符转义)
    • Werkzeug:路由模块
    • click:事件监听系统
    • flask:本身这个类
    • itsdangerous:数据加密传输

    创建flask项目

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

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

     

    创建主程序

    from flask import Flask
    #创建应用对象 app
    = Flask(__name__)
    #视图加载 @app.route(
    '/')   #声明路由,flask的路由是通过视图添加装饰器的方式进行编写的,也可以分离到另一个文件中 def index():    #声明视图函数 return 'ok'  #通过return返回普通字符串
    #启动项目,不要在run后加任何代码,不会被执行 if __name__ == '__main__': app.run(debug=True,port=8000,host='0.0.0.0')
      #debug默认是Fales,改成True就是测试模式或者开发模式,改完代码会自动重启
      #port可以修改端口
      #host 绑定域名(用的较少)--请看加载配置代码

    flask类代码分析

    from flask import Flask
    
    ```
    import_name      Flask程序所在的包(模块),传__name__可以决定,Flask在访问静态文件时查找的路径
    static_path    静态文件访问路径(不推荐使用,使用 static_url_path 代替)
    static_url_path     静态文件访问路径,可以不传,默认:/+static_folder
    static_folder      静态文件存储的文件夹,可以不传,默认为static
    template_folder    末班文件存储的文件夹,可以不传,默认为tempates
    
    ```   

    加载配置

    from flask import Flask
    
    app = Flask(__name__    )
    
    #1.1加载项目配置
    class Config(object):
        DEBUG = True        ##配置项目运行在debug调试模式下
    #1.2加载配置到应用对象中
    app.congfig.from_object(Config)
    
    @app.route('/')
    def index():
        return 'ok'
    if __name__ == '__main__':
        app.run()

    路由的基本定义

    路由:一种访问地址[url]和应用程序的[视图]进行一对一的绑定的映射关系,在开发中,我们所说的路由,通常指的是完成路由绑定关系的路由类

    路由和视图的名称必须全局唯一,不能出现重复,否则报错

    from flask import Flask
    
    app = Flask(__name__)
    
    class Config():
        DEBUG = True
    
    app.config.from_object(Config)
    
    
    @app.route(rule="/home")    #可以指定一个或者多个参数进行传递
    def index(): 
        return "ok"
    
    @app.route(rule="/home")  #路由一样则前面的执行,后面的不会执行
    def index(): #函数一样则报错  error
        return "ok"if __name__ == '__main__':
        app.run() 

    路由传参

    #无限定类型
    from flask import Flask
    
    app = Flask(__name__    )
    
    
    class Config(object):
        DEBUG = True
    
    app.config.from_object(Config)
    
    @app.route('/home/<user_id>')    # 没有限定参数的类型,所以user_id可以是数字,也可以是其他类型的信息(除了斜杠)
    def index(user_id):
        return 'user_id=%s' %user_id
    
    
    @app.route('/home/<user_id>-<mobile>')    # 传多个参数,-分开
    def index1(user_id,mobile):    #这里的参数名称必须和路由上面的保持一致
        return "user_id=%s,mobile=%s" % (user_id,mobile)
    if __name__ == '__main__': app.run()
    #限定类型
    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()

    #限定路由参数的类型,flask系统自带转换器编写在werkzeug.routing.py文件中site-packages/werkzeng/routing.py
    
    
    DEFAULT_CONVERTERS = {
        "default": UnicodeConverter,    #字符串类型
        "string": UnicodeConverter,     #字符串类型,上面和这个没什么区别
        "any": AnyConverter,        #任意类型
        "path": PathConverter,      #路径类型
        "int": IntegerConverter,    #整型
        "float": FloatConverter,    #浮点型
        "uuid": UUIDConverter,     #唯一通用标识符
    }
    
    
    自定义路由转换器
    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,map,*args,**kwargs):
            # 3. regex必须有参数
            self.regex = args[0]
            super().__init__(map)
    
    # 4. 注册
    # app.url_map.converters["使用别名"] = 转换器类名
    app.url_map.converters["mob"] = MobileConverter
    
    # 路由转换器对路由参数的类型进行限定
    @app.route(rule="/<mob('1[3-9]d{9 }]'):user_id>")
    def index(user_id):
        print(type(user_id))  # <class 'float'>
        return "user_id=%s" % user_id
    
    if __name__ == '__main__':
        app.run()

    注册路由与视图代码进行分离

    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)

    http请求与响应

    路由限定请求方式

    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)

    请求中的表单数据

    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请求处理对象
        # 接受表单数据
        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']
    
        # 格式转换
        # ImmutableMultiDict 转换成基本格式
        # 注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值
        ret = request.form.to_dict() # {'username': 'xiaoming', 'password': '123456', 'lve': 'swimming'}
        
        return "ok"
    
    if __name__ == '__main__':
        app.run(debug=True)

    客服端请求的其他数据

    from flask import Flask,request    #request是一个对象
    from werkzeug.datastructures import ImmutableMultiDict
    
    app = Flask(__name__)
    
    @app.route("/query")
    def get_query_params():
        """获取查询字符串 query_params"""
        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)

    数据响应

    from flask import Flask,request,make_response,Response,jsonify
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        """返回html数据"""
    
        # return "ok"
        # return make_response("ok") # 上面的代码是这段代码的简写
        # return Response("ok") # 上面make_response本质上就是Response
    
        """返回json格式数据"""
        # data = {"name":"xiaoming","age":13}
        # return jsonify(data)
    
        """返回其他类型数据"""
        # 关于Response常用的参数
        # Response(response="内容", status="http响应状态码",headers=自定义响应头,mimetype="数据格式")
        # return Response(response="ok",status=201,headers={"company":"hello"})
        # 返回图片信息
        with open('./1.zip',"rb") as f:
            content=f.read()
        # 判断权限,身份...
        return Response(response=content,mimetype="application/zip")
    
    if __name__ == '__main__':
        app.run(debug=True)

    重定向

    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"))
    
    # 跳转到站外地址
    @app.route("/go")
    def go():
        return redirect("http://www.luffycity.com")
    
    if __name__ == '__main__':
        app.run(debug=True)
  • 相关阅读:
    转贴: AV音响连接方法 回上个问题,次世代音轨通过HDMI透传给了功放,那图像信号怎么给到电视? 这篇文章教你
    openmosix学习心得,openmosix和pbs系统的差异
    转载:高清音频格式详解
    PVFS2 Failover Policy - 当一块硬盘坏了以后,PVFS如何应对?数据会丢失么?
    转贴: 浅析多声道LPCM TRUE HD DTS HD之异同
    [存储知识]SAN和NAS的进一步解析
    转贴: 次时代音轨
    7×24小时硬盘-正在走向桌面用户的企业级硬盘
    Learning NFS/NIS 2nd 读书笔记-Chapter1 Network Fundamentals
    新闻管理页面源码
  • 原文地址:https://www.cnblogs.com/zhangjiahao996/p/14002474.html
Copyright © 2011-2022 走看看