内容概述:
Web 访问流程
路由定义
json 数据格式
正则路由转换
Web 访问流程
客户端发送请求到服务器
服务器进行判断,请求静态资源的话就直接返回
请求其他功能服务器会把请求发送给 web 框架
由 web 框架来进行具体的业务逻辑判断,根据请求从数据库中查找数据
先返回给服务器,然后又服务器返回给客户端
搭建虚拟环境
windows 中安装虚拟环境
pip install virtualenv
pip install virtualenvwrapper-win # 支持 windows
配置环境变量:在环境变量中,加上
WORKON_HOME: 路径
这个环境变量mkvirtualenv 虚拟环境名称 # 创建虚拟环境, 可以使用 -p 来指定 python 版本
workon # 列出所有的虚拟环境
workon 虚拟环境名称 # 切换虚拟环境
pip install flask # 在虚拟环境中安装 flask
pip list # 查看虚拟环境中安装的 flask
deactivate # 退出虚拟环境
rmvirtualenv 虚拟环境名称 # 删除虚拟环境
# 导入 Flask
from flask import Flask
# 创建 Flask 的应用程序
app = Flask(__name__,
# static_path='/static', # 表示静态文件访问的路径
static_url_path='/python04',
static_folder='static', # 表示静态文件所存放的目录,默认值是 static
template_folder='template' # 表示模板文件存放的目录
)
# ===从对象中加载配置=== (掌握)
# class Config(object):
# DEBUG = True
# app.config.from_object(Config)
# ===从文件中加载配置== (会用)
# app.config.from_pyfile('config.ini')
# ===从环境变量中加载配置=== (了解)
# app.config.from_envvar('ENVCONFIG')
# 一些常用的配置,可以直接通过 app. 的形式设置
app.debug = True
app.config['DEBUG'] = True
# 使用装饰器路由去与视图进行关联
@app.route('/')
def index():
print(app.config['DEBUG'])
return 'hello worldaaa'
if __name__ == '__main__':
# 运行当前 Flask 应用程序
app.run(debug=True)
路由定义(重点)
@app.route(“/”)
注意所有的路径都是以斜杠 / 开头
json数据格式(重点)
json.dumps() 把字典转换为 json
json.loads() 把 json 字符串转化为字典
jsonify() 将其他数据转化为 json
重定向
redirect : 从 flask 中导入这个模块 , 重定向到其他网站
url_for: 取到指定视图函数所对应的路由 url, 并且可以携带参数
返回自定义状态码
直接在返回的数据后面加上自定义的状态码即可
from flask import Flask, jsonify
from flask import json
from flask import redirect
from flask import request
from flask import url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/demo1')
def demo1():
return 'demo1'
@app.route('/user/<int:user_id>')
def demo2(user_id):
return 'demo2 %s' % user_id
@app.route('/demo3', methods=['GET', 'POST'])
def demo3():
return 'demo3 %s' % request.method
@app.route('/json')
def demo4():
json_dict = {
"name": "laowang",
"age": 18
}
# 使用 json.dumps 将字典转换成 json 字符串
result = json.dumps(json_dict)
# 使用 json.loads 将 json 转成字典
# test_dict = json.loads('{"age": 18, "name": "laowang"}')
# jsonify 将其他数据转化为 json
return jsonify(json_dict)
@app.route('/redirect')
def demo5():
# 重定向到自己写的视图函数
# url_for:取到指定视图函数所对应的路由url,并且可以携带参数
return redirect(url_for('demo2', user_id=123))
# 重定向到煎蛋
# return redirect('http://www.jandan.com/ooxx')
@app.route('/demo6')
def demo6():
return 'demo6', 666
if __name__ == '__main__':
print(app.url_map)
app.run(host='0.0.0.0', port=8888, debug=True)
正则路由转换
pycharm 导包快捷键: alt + enter
from flask import Flask
from flask import redirect
from flask import url_for
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
"""自定义正则的转换器"""
# regex = "[0-9]{6}"
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
# 取到第一个值,给regex 属性赋值
self.regex = args[0]
def to_python(self, value):
return int(value)
class ListConverter(BaseConverter):
"""自己定义转换器"""
regex = "(\\d+.?)+\\d$"
def to_python(self, value):
"""当匹配到参数之后,对参数做进一步的处理,再返回 给视图函数中"""
return value.split(',')
def to_url(self, value):
""" 使用 url_for 的时候,对视图函数传的参数进行处理,处理完毕之后以便能够进行路由匹配"""
result = ','.join(str(v) for v in value)
return result
app = Flask(__name__)
# 将自己的转换器添加到默认的转换器列表中
app.url_map.converters["re"] = RegexConverter
app.url_map.converters["list"] = ListConverter
@app.route('/')
def index():
return 'index'
# 规则:/user/6 位数字,
# 自定义转换器
@app.route('/user/<re("[0-9]{6}"):user_id>')
def demo1(user_id):
return "用户的id是 %s" % user_id
@app.route('/users/<list:user_ids>')
def demo2(user_ids):
return "用户的列表是 %s" % user_ids
@app.route('/demo3')
def demo3():
return redirect(url_for('demo2', user_ids=[1, 2, 3, 4, 5]))
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8888, debug=True)