flask框架使用/路由/配置/使用sqlachemy/

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方法配置路由


总结:
添加路由方式可以用装饰器
1.@app.route('/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)
# 接收路径类型



使用sqlachemy查询数据编写接口

from flask import Flask
from sql_session import my_session
# 将创建好的session拿过来
from models import text

app = Flask(__name__)


@app.route('/')
def index():
    my_session.add(text(name='moon'))
	# 直接对于表数据进行新增
    my_session.commit()
    my_session.close()
    return '添加成功'


if __name__ == '__main__':
    app.run()

sql_session文件内容

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker,scoped_session

engine = create_engine('mysql+pymysql://moongod:123@127.0.0.1:3306/text')


Session = sessionmaker(bind=engine)

my_session = scoped_session(Session)

posted @   Python-moon  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示