Flask

Posted zhouzetian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

 

 

 

    

以上是关于Flask的主要内容,如果未能解决你的问题,请参考以下文章

FlaskFlask特有的变量和函数

FlaskFlask与RESTful开发相关API

Flaskflask+uwsgi+nginx环境部署

FlaskFlask Cookie操作

FlaskFlask框架使用中异常捕获

FlaskFlask与SMTP协议邮件扩展