python 主流web框架
web框架的本质都是一样的
django 大而全 内置的app很多,第三方支持的app也很多
flask 小而精 没有过多的内置组件只完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能
fastapi 异步的web框架,接口支持的并发更高,近两年很火,很多人使用
https://fastapi.tiangolo.com/zh/ 中文文档
sanic:python的异步web框架,供支持异步高并发请求的 web 服务
ornado:异步框架,用的比较少了
同步框架和异步框架的区别
多个客户端同时访问服务,产生并发。
客户端访问django 首先访问的是 wsgi协议的web服务器 uwsgi (gunicon) 同步框架我们是使用
多进程多线程开启多个服务 应对并发,
django的并发量取决于uwsgi 每个进程可以开启一个uwsgi 同步框架 程序中遇到io操作 线程就会
变成阻塞态 一个线程只可以处理一个请求,所以同步框架的并发量并不高
同步就是一个线程处理一个请求,一个请求结束后才可以接受其他请求
异步框架:
将耗时的任务 交给workr去做 这样遇到io操作 就交给了workr然后又去 接另一个请求,这样就可以一个线程下接到多个请求,并发量就提升了,但是效率本质上是差不多的,因为真正处理任务的还是cup,对用户来言速度是一样的,但是项目并发量会大大提高,线程不会有太多等待io操作的空闲时间,线程可以接收更多的请求
-djagno是同步框架还是异步框架,djagno 3.x以后支持异步 但是异步框架还是不推荐用django
-同步框架的意思:一个线程只处理一个请求
-异步框架的意思:一个线程可以处理多个请求
-异步框架可以很显著的提高并发量 io操作多的系统 推荐异步
flask框架介绍
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架
-Werkzeug WSGI 符合wsgi协议的web服务器,django使用的是wsgiref
-jinja2 模板语法,django的dtl,非常像
快速使用
# 安装:pip install flask 安装依赖: MarkupSafe, Werkzeug, Jinja2, flask
-1.x 没有本质区别
-2.x 没有本质区别,源码上动了,用起来一样
from flask import Flask
app = Flask(__name__)
# 实例化出一个对象
# 通过装饰器的方法 指定这个视图函数的路由地址
@app.route('/index')
def index():
return 'index'
if __name__ == '__main__':
app.run()
# app.run('127.0.0.1',5000)
# 可以设置访问地址和端口号,不写默认本地5000端口
登录显示用户信息案例
from flask import Flask
from flask import request, render_template, redirect, session
app = Flask(__name__)
app.secret_key = '@500!127.0.0.1!@moon_god!'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
# request对象封装成了模块
# 每个视图函数用的request都是不同的
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
# 取出前端发的post请求数据
if username == 'moon' and password == '123':
session['name'] = username
return redirect('/')
# 登录成功 重定向到'/'路径
else:
return render_template('login.html', error='用户名或密码错误')
# 重新渲染 login页面 并 传参数 error= '用户名或密码错误' 前端可渲染该参数
USERS = {
1: {'name': 'moon', 'age': 25, 'gender': '男'},
2: {'name': 'haha', 'age': 25, 'gender': '男'},
3: {'name': 'xixi', 'age': 25, 'gender': '男'},
}
@app.route('/')
def home():
if session.get('name'):
# 查看用户是否登录
return render_template('home.html',user_dict=USERS)
# 渲染首页,并传入参数用户信息对象
else:
return redirect('/login')
# 生成一个路由,并接受前端通过路由传来的pk
@app.route('/detail/<int:pk>')
def detail(pk):
user_info = USERS.get(pk)
return render_template('detail.html',user_info=user_info)
# 重新渲染detail.html 并传递参数user_info
if __name__ == '__main__':
app.run()
# app.run('127.0.0.1',5000)
# 可以设置访问地址和端口号,不写默认本地5000端口
总结:
1.注册路由:给视图函数添加路由访问地址 app.route(路径,methods=[请求方式get,post])
2 新手四件套:
-render_template 渲染模板 跟django有区别
-redirect 重定向
-return 字符串 返回字符串
-jsonify 返回json格式字符串 返回字典或者列表
jsonify({'name':moon,'age':18})
3 请求的request对象,是全局的,直接导入使用即可,在不同视图函数中不会混乱
request.method 请求方式
request.form post请求的body体的内容转成了字典
4 session 全局的,直接导入使用即可,一定要指定秘钥
app.secret_key = 'asdfasdfa33aef3aefads'
放值:session['name']='lqz'
取值:session.get('name')
5 模板的渲染
-兼容django的dtl
-更强大,可以加括号,字典可以.get .values() .items()
-{% for %}
6 转换器@app.route('/detail/<int:pk>')
flask的配置文件
方式一 : 直接通过app对象设置
app.debug=True # 调试模式,提示信息更详细,修改代码不需要重启,自动重启
app.secret_key='dasdfasdfasd' # 秘钥,只能 放debug和secret_key
方式二:常用的,使用类的方式
class ProductionConfig(object):
DATABASE_URL = '127.0.0.1'
SECRET_KEY = '8081sa!@#moongod@'
class DevelopmentConfig():
DEBUG = True
DATABASE_URL = '127.0.0.1'
SECRET_KEY = 'text!@#moongod@'
app.config.from_object('settings.DevelopmentConfig')
app.config.from_object('settings.ProductionConfig')
# 直接导入对应的类即可更改对应的配置 很方便
方式三:使用py文件(不常用)
app.config.from_pyfile("settings.py")
print(app.config)
# 在一个py文件中进行键值对的设置
方式四:通过环境变量配置
app.config.from_envvar("环境变量名称")
通过json文件配置
app.config.from_json("json文件名称")
字典格式---》配置中心
可以通过api接口 去配置中心获取到对应的配置 拿回一个字典
app.config.from_mapping({'DEBUG': True})
内置的配置字段,其他可以写自己的,比如 redis的连接地址,mysql的连接地址
-DEBUG
-SECRET_KEY
# 密钥设置
-SESSION_COOKIE_NAME
# 设置cookie的名字 默认叫session
-PERMANENT_SESSION_LIFETIME = timedlta(days=7)
# 设置cookie的过期时间
路由相关
flask 大部分都是基于装饰器实现,也可以抽取到一个urls文件中
@app.route('/login')
def index():
pass
我们这样写路由本质上就是 index=app.route('/login')(index)
app.route的源码分析
# 1.app.route('/login')的执行结果 decorator 函数
# 2.decorator中的参数f就是被装饰的函数
# 3.
@setupmethod
def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]:
def decorator(f: T_route) -> T_route:
endpoint = options.pop("endpoint", None)
self.add_url_rule(rule, endpoint, f, **options)
# 本质就是执行了app.add_url_rulefan方法 这个方法就是在添加路由
# 添加路由装饰器的本质其实就是执行了这个函数,传入了对应的参数
return f
return decorator
如何不使用路由装饰器,也可以单独在一个py文件中 去通过 app.add_url_rulefan方法配置路由
总结:
添加路由方式可以用装饰器
[email protected]('/login',methods=['GET','POST'])
直接添加
2.app.add_url_rule('/',endpoint=None,view_func=login,methods=['GET','POST'])
# 访问跟'/'路径 可以使用 get post方法 触发视图函数login
路由可配置参数
rule URL
view_func 视图函数名称
defaults = None 默认值, 当URL需要参数,函数需要参数时,使用defaults = {'k': 'v'}为函数提供参数
# eg:app.add_url_rule('/',endpoint=None,view_func=login,defaults={'name':'moon'})
# 这样就相当于 默认给 login视图函数传参 name=moon login参数必须接收name这个行参
endpoint = None, 别名,用于反向解析URL,即: url_for('名称')
methods = None, 允许的请求方式,如:["GET", "POST"]
路由中的转换器
app.add_url_rule('/<pk>',endpoint=None,view_func=login)
# 默认行参 pk是字符串类型
app.add_url_rule('/<int:pk>',endpoint=None,view_func=login)
# int 整数类型
app.add_url_rule('/<path:url>',endpoint=None,view_func=login)
# 接收路径类型
标签:name,框架,flask,route,配置,login,app,路由
From: https://www.cnblogs.com/moongodnnn/p/17280659.html