flask框架基础语法
安装
pip3 install flask==0.12.5
安装好之后提供了这几个模块:
- Jinja2:模板引擎
- MarkupSafe:编码转换工具(字符转义)
- Werkzeug:路由模块
- click:事件监听系统
- flask:本身这个类
- itsdangerous:数据加密传输
与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件
创建主程序
from flask importFlask
#创建应用对象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_folderstatic_folder 静态文件存储的文件夹,可以不传,默认为static
template_folder 末班文件存储的文件夹,可以不传,默认为tempates
```
加载配置
from flask import Flaskapp
= 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()
from flask import Flaskapp
= Flask(__name__)class Config():DEBUG
= Trueapp.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.pyDEFAULT_CONVERTERS = {
"default": UnicodeConverter, #字符串类型
"string": UnicodeConverter, #字符串类型,上面和这个没什么区别
"any": AnyConverter, #任意类型
"path": PathConverter, #路径类型
"int": IntegerConverter, #整型
"float": FloatConverter, #浮点型
"uuid": UUIDConverter, #唯一通用标识符
}
自定义路由转换器
from flask import Flaskapp
= Flask(__name__)class Config():DEBUG
= Trueapp.config.from_object(Config)
# 自定义路由转换器#
1. 声明的路由转换器类必须直接或间接继承于BaseConverterfrom 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 Flaskapp
= 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 Flaskapp
= 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,requestfrom werkzeug.datastructures import ImmutableMultiDictapp
= 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 ImmutableMultiDictapp
= 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,jsonifyapp
= 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_forapp
= 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框架基础语法 的全部内容, 来源链接: utcz.com/z/538018.html