• Flask(一)


    Flask有两大核心:Werkzeug和Jinja2

    Werkzeug实现路由,调试和web服务器网关接口,Werkzeug库的routing模块负责URL的解析,不同的URL对应不同的视图函数.

    routing模块内部有:

    Rule类: 用来构造不同的URL模式的对象,路由URL规则

    Map类: 存储所有的URL规则和一些配置参数

    BaseConverter的子类,负责匹配的规则

    MapAdapter类: 负责协调Rule做具体的匹配工作

    Jinja2实现模板.

    from flask import Flask

    app = Flask(__name__)

    @app.route("/")

    def hello():

      return "hello world"

    if __name__ == "__main__":

      app.run()

    Flask模块介绍:

    from flask import Flask

    # __name__:会认为该文件所在的目录就是flask项目目录

    # static_url_path:访问静态文件的前缀

    # static_folder: 静态文件所在的目录文件夹名称

    # template_folder:模板文件所在的目录文件夹名称

    app = Flask(__name__,

          static_url_path="/static",

          static_folder ="static",

          template_folder ="templates")

    @app.route("/")

    def index():

      return "index"

    if __name__ == "__main__":

      app.run()

    加载项目配置信息

    from flask import Flask

    # 自定义项目配置类

    class Config(object):

      DEBUG = True

    app =Flask(__name__)

    # 方式一:使用类的方式加载配置信息(重点)

    app.config.from_object(Config)

    # 方式二:在同级目录中建立一个配置文件('my.ini')

    app.config.from_pyfile('my.ini')

    # 方式三:使用环境变量方式加载项目配置信息

    # 跟方式二一样,先写一哥配置文件,然后将文件的路径加入到环境变量中

    # config的本质是一个字典

    @app.route("/")

    def hello():

      # 两种方式获取字典的值,

      # get方式获取不到则不会报错,默认为空

      print(app.config.get("DEBUG",""))

      # 找不到会报错

      print(app.config["DEBUG"]")

      return "hello world"

    if __name__ == "__main__":

      # 0.0.0.0表示本机所有ip均可访问, port代表端口号

      app.run(host="0.0.0.0", port = 8888, debug=True)

     转换器提取url路径的参数

    from flask import Flask

    app = Flask(__name__)

    @app.route("/")

    def demo1():

      return "hello world"

    # <user_id>转换器提取url路径的参数

    # user_id的类型默认是字符串类型

    # 127.0.0.1/user/字符串类型的数据

    @app("/user/<user_id>")

    def demo3(user_id):

      return "user_id:%s" % user_id

    # 限制输入的数据类型

    # 127.0.0.1:5000/user_id/int数据类型

    @app.route("/user_id/<int:user_id>")

    def demo4(user_id):

      return "user_id"% user_id

    if __name__=="__main__"

      app.run(debug=True)

    请求方式:GET及POST

    from flask import Flask

    app = Flask(__name__)

    # 不设置默认是get请求方式

    @app.route("/")

    def hello_world():

      return "hello world"

    # 设置post请求方式

    @app.route("/post", methods=["POST"])

    def demo():

      return "post success"

    if __name__ == "__main__":

      print(app.url_map)

      app.run(debug=True)

    自定义转换器类

     from flask import Flask

    from werkzeug.routing import BaseConverter

    app = Flask(__name__)

    # 自定义转换器

    class RegexConverter(BaseConverter):

      # 重写regex属性,当你将正则表达式传入给它,BaseConverter类帮你处理

      # url_map,re只是参数

      def  __init__(self, url_map, re):

        # 初始化父类

        super(RegexConverter, self).__init__(url_map)

        self.regex = re

    # 注册正则匹配类

    # 往flask源码里面添加一个键值对

    """

    往flask源码里面添加一个键值对

    {

    re:RegexConverter

    }

    """

    # 将re转换成RegexConverter类

    app.url_map.converters["re"] = RegexConverter

    # re("d{6}")-->RegexConverter(app.url_map, "d{6}")

    @app.route("/user/<re("d{6}"):user_id>)

    def demo1(user_id):

      return "user %s" % user_id

    if __name__ == "__main__":

      app.run(debug=True)

    获取请求参数:

    data: 记录请求的数据

    form: post请求中的表单数据

    args: get请求中的参数

    cookies: 记录请求中的cookie信息

    headers: 记录请求中的报文头

    method: 记录请求使用的http请求方法

    url: 记录请求的URL地址

    files:记录请求上传的文件

    from flask import Flask, request

    # 默认请求时get请求,127.0.0.1:5000/get?user_name=kangkang&age=18

    @app.route("/get")

    def demo1():

    """提取get请求号后面携带的参数"""

    #request.method属性获取访问方式,后面的请求方式必须大写

      if request.method == "GET":

        user_name = request.args.get("user_name", "")

        age = request.args.get("age")

        return "%s %s" %(user_name, age)

      else:

        return "请求方式错误405!"

    # post请求提取参数

    # 需要指明请求方式为POST

    @app.route("/post", methods = ['POST'])

    def demo2():

      if request.method == "POST":

        user_name = request.form.get("user_name", "")

        age = request.form.get("age", "")

        return "%s %s"%(user_name, user_id)

      else:

        return "405请求方式错误"

    # 文件上传

    @app.route("/upload", methods=["POST"])

    def demo3():

      if request.method == "POST":

        file = request.files.get("pic", "")

        # 将图片保存到服务器本地

        file.save("./1.png")

      else:

        return "405请求方式错误"

    if __name__ == "__main__":

      app.run(debug=True)

    注意点:

    GET:获取服务器的数据,问号里面携带的参数,告知服务器我要什么类型的数据

    POST:往服务器新增数据,请求体里面携带参数,一般是需要存入的数据

    构造响应数据:

    import json

    from flask import Flask, jsonify

    app = Flask(__name__)

    @app.route("/")

    def demo1():

    # json数据转换

    dict = {

      "name":"kangkang",

      "age":24,

      "info":{

        "team":"laker"

        }

      }

    # 序列化,将python对象转化成json字符串

    json_str = json.dumps(dict)

    # 反序列化:将json字符串转换成python对象

    my_dict = json.loads(json_str)

    # jsonify:能够将python对象转换成json对象

    # 能够将响应体数据封装成响应对象并返回

    # 指明了响应数据的格式:ContentType = "application/json"

    my_json = jsonify(dict)

    return my_json

    if __name__ == "__main__":

       app.run(debug=True)

    重定向

    from flask import Flask, redirect, url_for

    # redirect:重定向,输入指定的路径会跳转到指定的地址

    # url_for("要重定向的函数名称","参数值")

    app = Flask(__name__)

    @app.route("/index/<int:user_id>")

    def hello(user_id):

      return "hello %d" user_id

    @app.route("/demo2")

    def demo2():

      # 重定向到百度

      return redirect("www.baidu.com)

    @app.route("/demo3")

    def demo3():

    # 重定向到指定的函数

    # url_for:反向解析函数

    # 传入的函数名称--->解析对应的url,根据app.app_url就能返回对应的url

      return redirect(url_for('hello', user_id = 6666))

    if __name__ == "__main__":

      app.run(debug=True)

        

  • 相关阅读:
    log4j配置文件动态指定日志文件名称
    如何在natTable表格上添加双击事件
    如何让natTable表格支持自定义多个右键菜单
    java1.7集合源码阅读:ArrayList
    关于java1.7集合源码阅读
    多线程之:如何避免死锁
    idea控制台中文乱码“淇℃伅”
    独立的js文件中不能使用EL表达式取值
    不能在jsp页面<c:choose>对标签中使用<!---->进行注释
    Excel导入工具类
  • 原文地址:https://www.cnblogs.com/zhouzetian/p/9682783.html
Copyright © 2020-2023  润新知