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了。
然后创建虚拟环境,若出现:
image
出现此报错的原因是因为之前的虚拟环境没有退出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
posted @ 2021-05-19 15:06  芜湖〃  阅读(388)  评论(0)    收藏  举报
∧