独立
的python环境, 可以有效的避免框架的多版本冲突
问题mkvirtualenv -p python3 env20
deactivate
workon env20
workon 双击tab
mac安装虚拟环境:
https://www.jianshu.com/p/dc7ec6a303e3
pip install flask==0.10.1
pip freeze
from flask import Flask
# 1.创建web应用
app = Flask(__name__)
@app.route("/") # 绑定路由: 当访问指定的URL时, 会调用对应的视图函数
def index(): # 首页展示
a = 10 / 20
return "首页"
if __name__ == '__main__':
# 2. 运行web应用 (运行flask内置的测试服务器, 接收将请求并转发给web应用)
# 参数: 1> 绑定的ip 2> 监听的端口 3> 是否开启调试模式
# 万能ip 0.0.0.0 可以同时接收本机/局域网/外网的请求
# 开启调试模式 1> 可以在网页上显示python错误 2> 更新代码后, 会自动重启服务器
app.run(host="0.0.0.0", port=8000, debug=True)
from flask import Flask
app = Flask(__name__)
# methods参数用于设置路由支持的请求方式
@app.route('/', methods=['POST', 'GET']) # 路由必须以路径分隔符 / 开头
def index():
return "index"
if __name__ == '__main__':
# 记录了所有的路由规则(URL 支持的请求方式 视图函数的名字)
print(app.url_map)
app.run(debug=True)
# 常用属性 url method headers
print(request.url) # 请求的URL
print(request.method) # 本次请求的请求方式
print(request.headers) # 本次的请求头 类字典对象
print(request.headers["Host"])
print(request.headers.get("Host")) # 键不存在, 不会报错 推荐
# 获取查询字符串 一般用于GET传递数据 类字典对象
print(request.args.get("name"))
print(request.form.get("name"))
file = request.files.get("avatar") # type: FileStorage
# 保存到本地
file.save("image1.jpg")
# 获取文本数据 bytes 类字符串对象 包含二进制数据
# 编码 文本数据 -> 二进制 str1.encode("utf-8") = bytes1
# 解码 二进制 -> 文本数据 bytes2.decode("utf-8") = str2
data = request.data
# print(data)
# print(type(data))
str1 = data.decode("utf-8")
print(str1)
print(type(str1))
from flask import Flask, make_response
app = Flask(__name__)
# 自定义响应对象
@app.route('/')
def index():
# 视图函数返回值可以是str/bytes, 但最终都会被flask框架包装为Response响应对象
# return "index"
# 可以手动包装响应对象 作用: 自定义响应报文
response = make_response("index")
print(response.headers) # 类字典对象 可以取值和赋值
return response
if __name__ == '__main__':
app.run(debug=True)
# 返回json
@app.route('/demo1')
def demo1():
# json 是一种常用的数据交换格式 本质 带有格式的字符串 {} [] xml
dict1 = {"name": "zs", "age": 20}
# dict -> json字符串
json_str = json.dumps(dict1)
# print(json_str)
# print(type(json_str))
# json字符串 -> dict
dict2 = json.loads(json_str)
print(type(dict2))
# return json_str
# flask中内置了jsonify语法, 可以自动将dict转为json字符串, 并且设置响应的content-type为 applictiion/json
# return jsonify(dict1)
return jsonify(name="zs", age=20) # 也支持关键字实参形式来设置, 但是数据必须是内置类型
# 重定向: 跳转到网络的另一个位置 如:页面跳转 a href js window.location.href
@app.route('/demo2')
def demo2():
# return redirect("http://www.baidu.com")
# return redirect("/demo1")
# url_for获取视图函数的URL
# url1 = url_for("demo")
# print(url1)
# return "demo2"
# 开发中经常让redirect和url_for进行联用 有利于代码升级和重构
return redirect(url_for("demo"))
# 自定义状态码 作用: 方便快速排错
@app.route('/demo3')
def demo3():
# 设置第二个返回值, 用于自定义状态码
return "demo3", 700
http错误
的异常处理和主动抛出from flask import Flask, abort
app = Flask(__name__)
@app.route('/')
def index():
# a = 10 / 0
abort(404) # 主动抛出http错误
return "index"
# errorhandler可以捕获http错误, 还可以捕获系统内置错误
@app.errorhandler(404)
def error_404(e): # 必须设置形参来接收具体的错误信息
return "您访问的页面去浪迹天涯了... %s" % e
@app.errorhandler(ZeroDivisionError)
def error_zero(e):
return "除数不能为0"
if __name__ == '__main__':
app.run(debug=True)
用户的访问状态
进行记录
的机制, 如 用户是否观看过帮助信息, 用户是否已经登录, 用户的搜索记录等客户端
自动
将该网站的cookie数据发给服务器不太重要的数据
, 可以减轻服务器的存储压力cookie设置过期时间
max-age
cookie细节
from flask import Flask, request, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return "首页"
# 用户登录
@app.route('/login', methods=['GET', 'POST'])
def login():
# 判断是否为GET请求
if request.method == 'GET': # 显示页面
# 读取网页内容, 返回html字符串
with open("login.html") as f:
html_str = f.read()
return html_str
# POST处理 提交数据
# 获取参数
username = request.form.get("username")
password = request.form.get("password")
# 校验密码
if username == "laowang" and password == "123":
# 如果登录成功, 跳转到首页
return redirect(url_for("index"))
else:
return "登录失败"
if __name__ == '__main__':
app.run(debug=True)