-
flask框架基础语法
安装
pip3 install flask==0.12.5
安装好之后提供了这几个模块:
- Jinja2:模板引擎
- MarkupSafe:编码转换工具(字符转义)
- Werkzeug:路由模块
- click:事件监听系统
- flask:本身这个类
- itsdangerous:数据加密传输
与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件
创建主程序
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()
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)
出处:https://www.cnblogs.com/zhangjiahao996/p/14002474.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比