flask框架基础语法[Python基础]

python

安装

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)

以上是 flask框架基础语法[Python基础] 的全部内容, 来源链接: utcz.com/z/530746.html

回到顶部