目录
1.Flask框架整体流程:
2.run启动参数详解
"""app.py"""
# 导入Flask
from flask import Flask
# 创建Flask应用对象
app = Flask(__name__)
# 路由route + 视图函数hello_world
@app.route('/')
def hello_world():
# 响应:返回给浏览器的数据
return 'Hello World!'
# 添加一个路由和视图函数
@app.route('/index/')
def index():
return "Index 首页"
if __name__ == '__main__':
# 启动服务器
app.run(debug=True, port=5001, host='0.0.0.0')
# run()启动的时候还可以添加参数:
# debug 是否开启调试模式,开启后修改过python代码会自动重启
# port 启动指定服务器的端口号,默认是5000
# host 主机,默认是127.0.0.1,指定为0.0.0.0代表本机所有ip
3.模板渲染
"""app.py"""
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
# 返回字符串
return "Flask Home2"
# 模板渲染
@app.route('/index/')
def index():
# 返回字符串:支持HTML标签
# return '<b>Flask Index</b>' 一般做测试使用
# 模板渲染
return render_template('index.html', name="法外狂徒张三")
# JSON
# jsonify: 序列化(把对象转换成字符串)一般都采用这种方法
#return jsonify({'name': "张三","age": 33})
if __name__ == '__main__':
app.run()
4.项目拆分
项目首先拆成app.py和App包,App包又包含了__init__.py,views.py,templates.py,models.py这几个模块,项目主要运行app.py,
app.py中导入APP包,直接运行__init__.py,采用蓝图这种方式,导入view.py模块的东西,view.py模块再导入models.py模块
运行app.py模块带动其他几个模块的运行,在这个项目中就可以各司其职。
"""app.py"""
from App import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
"""__init__.py"""
# __init__.py :初始化文件,创建Flask应用
from flask import Flask
from .views import blue
def create_app():
app = Flask(__name__)
# 注册蓝图
app.register_blueprint(blueprint=blue)
return app
"""view.py"""
# views.py: 路由 + 视图函数
from flask import Blueprint
from .models import *
# 蓝图
blue = Blueprint('user', __name__)
@blue.route('/')
def index():
return 'index'
5.路由参数详解
string | (默认)接受任何不带斜线的文本 | ||
---|---|---|---|
int | 接受正整数 | ||
float | 接受正浮点值 | ||
path | 喜欢string ,但也接受斜线 | ||
uuid | 接受 UUID 字符串 | ||
any | 可以同时指定多种路径,进行限定 |
# views.py: 路由 + 视图函数
from flask import Blueprint
from .models import *
# 蓝图
blue = Blueprint('user', __name__)
@blue.route('/')
def index():
return 'index'
# string: 重点
# @blue.route('/string/<string:username>/')
@blue.route('/string/<username>/')
def get_string(username):
print(type(username)) # <class 'str'>
return username
# int
@blue.route('/int/<int:id>/')
def get_int(id):
print(type(id)) # <class 'int'>
return str(id)
# float
@blue.route('/float/<float:money>/')
def get_float(money):
print(type(money)) # <class 'float'>
return str(money)
# path: 支持/的字符串
@blue.route('/path/<path:name>/')
def get_path(name):
print(type(name)) # <class 'str'>
return str(name)
# uuid:d12fda71-e885-444a-8cbd-5cdcbcb7c232
@blue.route('/uuid/<uuid:id>/')
def get_uuid(id):
print(type(id)) # <class 'uuid.UUID'>
return str(id)
@blue.route('/getuuid/')
def get_uuid2():
import uuid
return str(uuid.uuid4())
# any: 从列出的项目中选择一个
@blue.route('/any/<any(apple, orange, banana):fruit>/')
def get_any(fruit):
print(type(fruit)) # <class 'str'>
return str(fruit)
# methods: 请求方式
# 默认不支持POST
# 如果需要同时支持GET和POST,就设置methods
@blue.route('/methods/', methods=['GET', 'POST'])
def get_methods():
return 'methods'
6.蓝图基本使用
1,宏伟蓝图
2,蓝图也是一种规划,主要用来规划urls(路由route)
3,蓝图基本使用
# 在view.py中初始化蓝图
blue = Blueprint('user',__name__)
# 在init文件中调用蓝图进行路由注册
app.register_blueprint(blueprint=blue)
7.Flask请求request
服务器在接受到客户端的请求后,服务器会自动创建一个Request对象。由Flask框架创建,Request对象不可修改
Response:服务器返回给客户端的数据
属性:
url | 完整请求地址 |
---|---|
base_url | 去掉GET参数的URL |
host_url | 只有主机和端口号的URL |
path | 路由中的路径 |
method | 请求方法 |
remote_addr | 请求的客户端地址 |
args | GET请求参数 |
form | POST请求参数 |
files | 文件上传 |
headers | 请求头 |
cookies | 请求中的cookie |
源码实现:
"""views.py"""
@blue.route('/request/',methods=['GET','POST'])
def get_request():
# 重要属性
print(request.method) # 请求方式,’GET‘或'POST’
# GET请求的参数
# ImmutableMultiDict:类字典对象, 区别是可以出现重复的key
print(request.args) # ImmutableMultiDict([('name', 'lisi'), ('name', 'wangwu'), ('age', '12')])
"""
print(request.args['name'],request.args['age']) #lisi 12
print(request.args.get('name')) # lisi
print(request.args.getlist('name')) # ['lisi', 'wangwu']
"""
# POST请求
print(request.form) # ImmutableMultiDict([('name', 'Lucy'), ('age', '13')])
#print(request.form.get('name')) # Lucy
# 查找方式和get请求一样
# cookie
print(request.cookies) # ImmutableMultiDict([('age', '14'), ('name', 'zhaosi')])
# 路径
print(request.path) # /request/
print(request.url) # http://127.0.0.1:5000/request/?name=lisi&name=wangwu&age=12
print(request.base_url) # http://127.0.0.1:5000/request/
print(request.host_url) # http://127.0.0.1:5000/
print(request.remote_addr) # 127.0.0.1, 客户端的ip
print(request.files) # 文件内容,ImmutableMultiDict([])
print(request.headers) # 请求头
print(request.user_agent) # 用户代理, 包括浏览器和操作系统的信息, python-requests/2.32.3
return 'request ok'
"""spider爬虫.py"""
import requests
# GET请求
res = requests.get('http://127.0.0.1:5000/request/?name=lisi&name=wangwu&age=12',
cookies={"name": "zhaosi", "age": "14"})
print(res.text)
# POST请求
#res = requests.post('http://127.0.0.1:5000/request/', data={"name": "Lucy", "age": 13})
#print(res.text)
在这里又写了一个spider爬虫.py文件,是为了在这个文件中可以直接看见前端的运行结果。
响应:
"""views.py"""
# Response: 服务器端向客户端发送的响应
@blue.route('/response/')
def get_response():
pass
# 响应的几种方式
# 1.返回字符串(不常用)
# return 'response ok'
# 2.模板渲染(前后端不分离)
# return render_template('index.html', name='lisi', age=33)
# 3.返回json数据(前后端分离)
data = {"name": "lisi","age": 44}
# return data
# jsonify(): 序列化,字典=>字符串
# return jsonify(data)
# 4.自定义Response对象
html = render_template('index.html', name='lisi', age=33)
print(html, type(html))
# res = make_response(html, 200)
res = Response(html)
return res
8.重定向Redirect
# views.py
# Redirect: 重定向
@blue.route('/redirect/')
def get_redirect():
# 重定向的几种方式
# return redirect('https://www.qq.com')
# return redirect('/response/')
# url_for(): 反向解析, 通过视图函数名反过来找到路由
# url_for('蓝图名称.视图函数名')
# ret = url_for('blue.get_response')
# print("ret:",ret) # '/response/'
# return redirect(ret)
# url_for()传参
ret2 = url_for('blue.get_response', name='王五', age=66)
return redirect(ret2)