首页 > 其他分享 >flask基本使用/路由/配置/

flask基本使用/路由/配置/

时间:2023-04-02 16:15:44浏览次数:47  
标签:name 框架 flask route 配置 login app 路由

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

相关文章

  • maven安装及配置教程
    @目录1什么是Maven1.1Maven概述1.2Maven的常用命令2怎么安装Maven2.1下载Maven包2.2配置环境变量2.3配置本地仓库2.4配置远程仓库1什么是Maven1.1Maven概述Maven是一个项目管理工具,可以对Java项目进行自动化的构建和依赖管理。Maven包含了一个项目对象模型(Proj......
  • NFS服务,配置exports文件,客户机测试
                ......
  • web服务器的配置
    以下是本文的部署环境:后端架构django==4.1.7服务器平台:阿里云服务器配置:CPU&内存:2核(vCPU)2GiB操作系统:Ubuntu22.04LTS64位实例规格:ecs.t6-c1m1.large(性能约束实例)实例规格族:ecs.t6当前使用带宽:1Mbps硬盘:40GB这里省略连接服务器的步骤,推荐使用vsc......
  • Elasticsearch 学习-Elasticsearch优化,硬件选择,分片策略,写入优化,内存设置,重要配置
    Elasticsearch学习-Elasticsearch优化,硬件选择,分片策略,写入优化,内存设置,重要配置6.1硬件选择Elasticsearch的基础是Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在ES的配置文件../config/elasticsearch.yml中配置,如下:#----------------------------......
  • 脚本批量备份交换机路由器配置研究
    交换机路由器配置文件备份批量脚本powershellrouterswitchbackupsshpowershell传教士原创文章。始于2023-04-02允许转载,但必须保留名字和出处,否则追究法律责任 ---【前言】---最近我看了一篇文章。讲的是:【目的】:以5分钟为循环周期,经ssh,用密码,用py批量备份交换......
  • Linux系统下Samba服务器的配置
     实训目的:掌握Samba服务器的主配置文件的设置;掌握Samba服务用户的添加及权限设置;掌握Samba客户机的应用。实训环境:操作系统为CentOS7的网络服务器。实训步骤:第1步:将目录/home/media设置为允许所有用户访问,但仅允许用户mary具有修改该目录的权限。其配置步骤简述如下。1)......
  • Typora通用配置
    1.通用2.外观3.编辑器4.图像以相对路径存储图像,复制图片到.md文件中,图像会自动存储在与当前文件同一目录的文filename.assets文件夹中。图片也可以放在云端,配置请见:https://blog.csdn.net/wujiangbo520/article/details/1285636605.Markdown......
  • Docker网络配置
    bridgemacvlandockernetworkcreate-dmacvlan--subnet=192.168.1.0/24--gateway=192.168.1.1-oparent=enp3s0-omacvlan_mode=bridgevlan暴露IP--net=bridgemacvlan--ip=IP桥接dockernetworkcreate-dbridge--subnet192.168.1.0/16--gateway192.168.1.1c......
  • Asp.Net Core 配置 Swagger
    1.Swagger版本控制1.1添加版本枚举类publicenumApiVersion{V1,V2,V3}1.2在启动类中添加Swagger的配置builder.Services.AddSwaggerGen(option=>{#region分版本的Swagger配置......
  • 【使用小记】Debian开箱不即用之apt镜像源之配置
    安装问题首先开局就是:```Debian读取数据出错请确认您已经插入了正确的安装介质......```(我默认的是繁体:```讀取資料時發生了問題請確認是否已確實放置安裝媒體...```)处理方法①:推荐!刷入livdCD,安装时候镜像源前用工具ping一下然后看看哪个快(这个方法不会轻易出......