flask 1 anaconda安装
老三样:django,flask和 tornado | twisted
新三样:sanic,FastAPI,vibora | django3.0,flask2.0
1、什么是路由?
2、anaconda 如何创建、查看、删除py的虚拟环境:
使用anaconda的好处:
anaconda能够充分利用系统,帮我们管理虚拟机环境下的包,把公共部分的包放在同一个目录下。
并且在安装时也给我们安装了180多个包,含盖了我们开发中使用频率最高的包。
而mkvirtualenv就不行,会重复下载相同的包。- 使用conda 安装会把相关依赖都拉下来安装了,而使用pip安装只会帮你装python的依赖库,像系统环境这样的依赖库是不会安装的
安装:
# 1.下载
wget https://repo.anaconda.com/archive/版本
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/版本
# 2.安装
bash Anaconda.sh
安装好了之后,输入conda list 或 conda -V
如果出现:conda:未找到命令
则在终端输入,
export PATH=~/anaconda3/bin:$PATH 【配置环境变量】
或
echo 'export PATH="/你的目录/anaconda3/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
就ok了。
然后创建虚拟环境,若出现:

出现此报错的原因是因为之前的虚拟环境没有退出source deactivate
重新进入虚拟环境: source activate
退出虚拟环境:source deactivate或conda deactivate
(1)、创建虚拟环境:
conda create -n 虚拟环境名 python=3.6
(2)、删除虚拟环境操作:(谨慎操作)
conda remove -n 虚拟环境名 --all
(3)、进入虚拟环境
conda activate 虚拟环境名
如果发现进不去,那么
source activate 虚拟环境名
conda activate 虚拟环境名
查看环境下已有的安装包:
conda list
在进入虚拟环境的情况下,安装对应包直接
# pip install xxxx 或者 conda install xxxx
pip install tensorflow
注意:此环境下的安装包在退出虚拟环境后无法使用的
退出当前虚拟环境:
conda deactivate
补充:Linux下查看已有虚拟环境:
conda info --envs
3、flask简单实用
from flask import Flask
app = Flask(__name__)
@app.route(rule="/")
def index():
return "hello,<h1>flask</h1>!!!"
# 加载项目配置
class Config(object):
DEBUG = True
app.config.from_object(Config)
if __name__ == '__main__':
# flask运行过程中,所有的路由最终都会被注册到url_map里面。
print( app.url_map )
app.run(host="0.0.0.0",port=5000)
4、路由传参
5、路由限定请求
from flask import Flask,request
# 限制客户端的http请求方法,注意这里与django不一样,flask并没有默认没有内置csrf攻击防范
@app.route(rule="/user", methods=["post","put","get","delete","patch"])
def user():
# 例如:地址栏中通过 http://127.0.0.1:5000/user?user=1 返回本视图
print(request.method) # 获取本次客户端的http请求方法 GET
print(request.query_string) # 获取本次客户端的查询字符串 b'user=1'
print(request.path) # 获取本次客户端请求的路由路径部分[去掉域名端口] /user
print(request.url) # 获取本次客户端请求的http url地址 http://127.0.0.1:5000/user?user=1
# 直接从请求中取到请求方式并返回
return request.query_string
6.HTTP请求与响应
reuqest对象是Request的一个子类,之前引入的是代理类:
(1)请求
文档: http://docs.jinkan.org/docs/flask/api.html#flask.request
- request:flask中代表当前请求的
request 对象 - 作用:在视图函数中取出本次请求数据
- 导入:
from flask import request、 - 代码位置:
- 代理类
from flask.app import Request, - 源码类:
from werkzeug.wrappers.Request - 父类:
from werkzeug.wrappers.base_request(真正实用到里面内容的类)
常用的属性如下:
| 属性 | 说明 | 类型 |
|---|---|---|
| data | 记录请求体的数据,并转换为字符串 只要是通过其他属性无法识别转换的请求体数据 最终都是保留到data属性中 例如:有些公司开发小程序,原生IOS或者安卓,这一类客户端有时候发送过来的数据就不一样是普通的表单,查询字符串或ajax |
bytes类型 |
| form | 记录请求中的html表单数据 | MultiDict |
| args | 记录请求中的查询字符串,也可以是query_string | MultiDict |
| cookies | 记录请求中的cookie信息 | Dict |
| headers | 记录请求中的请求头 | EnvironHeaders |
| method | 记录请求使用的HTTP方法 | GET/POST |
| url | 记录请求的URL地址 | string |
| files | 记录请求上传的文件列表 | * |
| json | 记录ajax请求的json数据 | json |
(2)获取请求中各项数据
@app.route("/", methods=["POST"])
def index():
# 获取原生查询字符串query_string
print( request.query_string )
print( parse_qs( request.query_string.decode() ) )
# 获取解析后的查询字符串
print(request.args) # 得到ImmutableMultiDict 是 一个有序字典,类似from collections import OrderedDict
print(request.args.get("username"))
# 获取多个相同键的值
print(request.args.getlist("hobby"))
# to_dict, 获取所有请求数据
print(request.args.to_dict(flat=True)) #多个相同的键,值返回第一个
print(request.args.to_dict(flat=False)) #返回多个相同的键和对应的值
# request.data 接受客户端发送过来的原生请求体数据,request.json,request.form,request.files等无法接受的数据,也全部都会保留到这里
print(request.data)
# 获取表单是数据
print(request.form) # ImmutableMultiDict([('username', 'hcj'), ('password', '123')])
print(request.form.get("username")) # hcj
# 接收上传,files是一个列表
print(request.files) # ImmutableMultiDict([('avatar', <FileStorage: 'note.png' ('image/png')>)])
print(request.files.get('avatar')) # <FileStorage: 'note.png' ('image/png')>
# 接受ajax或其他客户端提交过来的json数据
print(request.json) #{'username': 'hcj', 'pwd': '234'}
# 获取请求头信息
print( request.headers ) # 获取全部的而请求头信息
print( request.headers.get("host") )
# 获取本次请求的url地址
print( request.url) # http://127.0.0.1:5000/data
print( request.path ) # /data
(3)更多获取request请求的方法:
点开request.xx 的xx ,会跳到base_reques.py文件下,里面封装了很多方法,需要什么在里面找就行了。
7.自定义响应数据
@app.route("/", methods=["POST"])
def index():
# 响应状态码
return 'hellow',403 # 响应正文, 响应状态码[默认值:200]
# 路由响应实际上是走的 make_response
response = make_response("ok")
print(response)
response.headers["aa"] = "666" # 自定义响应头
response.status_code = 201 # 自定义响应状态码
return response
# 通过jsonify可以返回json数据
data = {
"id":1,
"uname":"xiaoming"
}
# 可以直接返回列表数据,
data = [
{"id":1,"username":"liulaoshi","age":18},
{"id":2,"username":"liulaoshi","age":17},
{"id":3,"username":"liulaoshi","age":16},
{"id":4,"username":"liulaoshi","age":15},
]
return jsonify(data) #若是django 还要在data后加上 safe=False
# 返回图片等其他自定义格式数据
with open("../aa.png","rb") as f:
content=f.read()
response= make_response(content)
response.headers["Content-Type"]="image/png" # MIME type 类型 ,
# 若不清楚某个文件填什么键值对,百度搜MIME type 对应文件的类型
return response
7.响应页面跳转
@app.route("/")
def index():
return redirect("http://www.baidu.com")
# redirect内部完成的事情如下:
from werkzeug.wrappers import Response
response = Response()
response.headers["Location"] = "http://www.baidu.com"
return response
# 重定向到自己写的视图函数
# url_for 根据视图函数名获取对应的url地址,如果视图对应的路径还有其他的路由参数,则作为附加参数填写在url_for的后续参数位置
url = url_for("user",user_id=3)
print(url) # 仅仅是根据参数从app.url_map中提取对应的url地址
return redirect(url)
@app.route("/user/<user_id>")
def user(user_id):
return f"用户中心,user_id={user_id}"
8.http的会话控制
所谓的会话: 就是客户端浏览器和服务端网站之间一次完整的交互过程.
会话的开始: 是在用户通过浏览器第一次访问服务端网站开始.
会话的结束: 在用户通过关闭浏览器以后,与服务端断开.
所谓的会话控制: 就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。
http 是一种无状态协议,浏览器请求服务器是无状态的。
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。而有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
实现状态保持主要有两种方式:
- 在客户端存储信息使用
Cookie,token[jwt,oauth] - 在服务器端存储信息使用
Session
什么是token?
补充:
token是一种用户身份认证信息的技术,一般我们称之为:Token认证。
翻译中文:token一般叫令牌
本质就是一个经过特殊处理的字符串,往往在字符串内部隐藏着识别用户身份信息的关键内容。
一般开发中,token往往都是以识别用户身份为目的来使用的。
一般使用情况下,token会以用户身份信息,当前时间戳,随机数等因子构成的。
当然,更多情况下,token一般分三段:"头部.载荷.签证"
像实际开发中,我们一般说的jwt,csrf等等场景里面的token都是这一类的。
10.cookie操作
@app.route('/set_cookie')
def set_cookie():
response = make_response('set cookie')
response.set_cookie('age', '19') # 过期时间是会话期,关闭浏览器以后,自动删除
response.set_cookie('username', 'xiaoming', max_age=3600) # 在指定max_age时间以后,才会自动删除
return response
@app.route('/get_cookie')
def get_cookie():
# 获取客户端发送过来的cookie要通过request.cookies来完成
# request.cookies 获取全部cookie
username = request.cookies.get('username')
age = request.cookies.get('age')
return f"username={username}&age={age}"
@app.route("/del_cookie")
def del_cookie():
# 删除cookie,cookie的删除必须要通过response对当前cookie设置无效的值(空),或者过期的有效时间,让浏览器自动删除
response = make_response("del cookie")
response.set_cookie("username","",expires=0)
return response

浙公网安备 33010602011771号