Flask框架基本使用
Flask框架基本使用
1.环境准备
pip install flask
- Flask Flask库文件
- Jinja2 模板渲染库
- MarkupSafe 返回安全标签 只要Flask 返回模板或者标签时都会依赖MarkupSafe
- Werkzeug 德文“工具” == uWSGI 底层是 WSGI Flask项目启动都是基于Werkzeug
2.应用Flask
2.1 启动服务
from flask import Flask
app=Flask(__name__)
app.run()
2.2 返回字符串
# -*- coding: utf-8 -*-
'''
@Time : 2021/12/17 16:49
@Author : ziqingbaojian
@File : app.py
'''
from flask import Flask
app=Flask(__name__)
@app.route('/index')
def index():
return 'Hello world'
if __name__ == '__main__':
app.run()
3.Response
3.1 返回值
Flask Django
-
HTTPResponse("HelloWorld") "HelloWorld"
-
render("html文件") render_template("HTML文件") # 默认存放路径是"templates"
-
redirect("/home") redirect("/home")
-
from flask import Flask from flask import redirect,render_template app=Flask(__name__) @app.route('/index') def index(): return render_template("index.html")#返回HTML界面 @app.route('/home') def home(): return redirect("/index")#使用重定向; if __name__ == '__main__': app.run()
3.2 特殊返回值
3.1 返回文件
-
send_file("文件路径") 返回文件
-
from flask import Flask, send_file from flask import redirect,render_template @app.route("/getfile") def getfile(): return send_file('./1.jpg') if __name__ == '__main__': app.run() https://typora-imgs-1308859190.cos.ap-beijing.myqcloud.com/giteeimg/image-20211217172743449.png
- send_file返回的文件如果无法被客户端识别(浏览器)识别,浏览器就会将该文件进行下载处理。
打开并返回文件内容 自动识别文件类型 在ResponseHeaders中加入
Content-Type:文件类型 - *文件类型 是可以被客户端识别的文件类型
不能识别的类型 下载处理 - 浏览器会下载
-
x-ms x二进制 ms微软 wma文件
-
本质上是修改了Conntent-Type中的值属性;
-
3.2 jsonfiy
-
jsonify("字符串或数据类型") 返回标准格式的JSON字符串
-
可以直接返回字典,但是不建议使用,没有良好的兼容性;直接返回dict时 本质上在执行jsonify(d)
-
**本质*:编写ResponseHeaders 加入 Content-Type:application/json
-
API 接口 AJAX.post({username:123}){function(data){ obj = data }}
-
打包JSON 序列化JSON字符串
-
from flask import Flask, send_file from flask import redirect,render_template from flask import jsonify @app.route("/getjson") def get_json(): dic={ "user":"章北海", "age":20, "msg":"Hello World" } return jsonify(dic) if __name__ == '__main__': app.run()
3.3 开启debug模式
-
使用debug默认重启项目
-
方式一
-
from flask import Flask, send_file from flask import redirect,render_template app=Flask(__name__) app.debug=True #此处设置debug @app.route('/index') def index(): return render_template("index.html") if __name__ == '__main__': app.run()
-
方式二
-
from flask import Flask, send_file from flask import redirect,render_template app=Flask(__name__) #app.debug=True #此处设置debug @app.route('/index') def index(): return render_template("index.html") if __name__ == '__main__': app.run(debug=True)
-
方式三
- 此方式,注意Debug必须要大写哦
-
from flask import Flask, send_file from flask import redirect,render_template app=Flask(__name__) app.config.update(DEBUG=True) @app.route('/index') def index(): return render_template("index.html") if __name__ == '__main__': app.run()
4.Request
-
methods=["GET","POST"] 在添加路由的装饰器中允许请求方式,覆盖
1.request.form 获取FormData中的数据 to_dict() ,返回ImmutableMultiDict
2.request.method 获取请求方式
3.request.args # 获取URL中的数据 字符串 get("key") to_dict() -
1.Request 导入 - 请求上下文 2.Request.method 请求方式 HTTP 8 种 POST DELETE PUT GET OPTIONS请求跨域 3.Request.path url_root 路由地址 4.Request.host 获取访问主机地址 # 方法: request.form # FormData中的数据 to_dict() 直接返回字典数据 request.args # URL中的数据 request.data 请求体的原始信息 只有在 Content-Type 没有 Form b"" request.json 请求头中的 Content-Type:application/json 字典 request.headers 请求头中的信息 request.cookies 请求中Cookie的信息 # 坑: request.values 不可触及的地带
-
登录界面示例
-
@app.route('/login',methods=['GET','POST']) def login(): if request.method=='GET': return render_template('login.html') # data=request.form#ImmutableMultiDict([('username', 'df'), ('username', 'fds')]) # print(data) user=request.form.get("user") pwd=request.form.get("pwd") if user=='123' and pwd=='123': return "登录成功" # 模板渲染是**{} return render_template('login.html',**{"error":"用户名或密码错误"})
5.session
- 基本使用
交由客户端保管机制
1.开启Session - session["user"] = 123
2.session 序列化字符串
3.通过 secret_key 进行加密
4.通过 Cookie 返回客户端
接收Session
1.通过 Cookie 获取 session
2.通过 secret_key 解密
3.反序列化 字典
from flask import Flask,session #手动导入
app=Flask(__name__)
app.secret_key="apsiddy@#$%6*(#@!!Dd"
#secret_key手动设置。
@app.route('/login',endpoint='login')
def login():
session["user"]="user on login"
return "login request"
@app.route('/index',endpoint='index')
def index():
a=session.get("user")
print(a)
return "index"
if __name__ == '__main__':
app.run()
说明:endpoint='index'
相当于django中的 URL 后name
的别名。应该保证唯一性。
6.加载配置文件
导入配置文件的源码:
def from_object(self, obj: t.Union[object, str]) -> None:
if isinstance(obj, str):
obj = import_string(obj)
for key in dir(obj):# 使用反射创建对象
if key.isupper():
self[key] = getattr(obj, key)
def import_string(import_name: str, silent: bool = False) -> t.Any:
import_name = import_name.replace(":", ".")
try:
try:
__import__(import_name)
except ImportError:
if "." not in import_name:
raise
else:
return sys.modules[import_name]
module_name, obj_name = import_name.rsplit(".",1)#按照点分割字符串为两段
module = __import__(module_name, globals(), locals(), [obj_name])
try:
return getattr(module, obj_name)
except AttributeError as e:
raise ImportError(e) from None
except ImportError as e:
if not silent:
raise ImportStringError(import_name, e).with_traceback(
sys.exc_info()[2]
) from None
return None
6.1 全局变量型
说明:与django的相同
settings.py
XX=123
DEBUG=True
try:
from .local_settings import *
except ImportError:
pass
local_settings.py
# 配置一些私密的配置和本地的配置
SECRET_KEY="apsiddy@#$%6*(#@!!Dd"
# 本地数据库连接,密码
'''
本文件上传的时候不进行上传,使用`.gitignore`进行忽略
'''
from flask import Flask,session
app=Flask(__name__)
# app.secret_key="apsiddy@#$%6*(#@!!Dd"
# 加载配置文件
app.config.from_object('config.settings')
print(app.config['XX'])
6.2 类的配置文件
settings.py
class BaseSettings(object):
X=123
# 将两种环境中所共有的特征进行抽取
class DevSettings(BaseSettings):
HOST='127.0.0.1'
class PordSettings(BaseSettings):
HOST='1.1.1.2'
7.视图
7.1 FBV
@app.route('/index',endpoint='index')
def index():
a=session.get("user")
print(a)
return "index"
if __name__ == '__main__':
app.run()
7.2 CBV
from flask import Flask,views
app = Flask(__name__,)
def outer(func):
def inener(*args,**kwargs):
print("before")
res =inener()
print("after")
return res
class UserView(views.MethodView):
methods = ['GET']
decorators = [outer,]
def get(self):
return "GET"
def post(self):
return 'OK'
# app.add_url_rule('/user',view_func=UserView.as_view(name='user'))# as_view的参数即为 endpoint
app.add_url_rule('/user',view_func=UserView.as_view())
if __name__ == '__main__':
app.run()