首页 > 其他分享 >Flask

Flask

时间:2023-04-01 16:57:09浏览次数:45  
标签:__ return name Flask app route 路由

目录

Flask

Flask和pythonweb框架介绍

python web框架,本质都是一样的

  1. django:大而全,内置的app多,第三方app也多,django3.x也支持异步操作了

    自带的应用:admin后台管理、auth身份鉴权、sessions会话管理
    第三方app:Django Rest Framework、Django CORS Headers 、Django Bootstrap
    

image

  1. Flask

    小而精,没有过多的内置组件,只完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能

  2. web.py

    是一个小巧灵活的Python框架,它简单而且功能强大(国内几乎没有用的)

  3. fastapi

    python的异步web框架,不少公司在用,https://fastapi.tiangolo.com/zh/

  4. sanic

    python的异步web框架,供支持异步高并发请求的 web 服务

  5. tornado

    异步框架,用的比较少了


# 同步框架和异步框架的区别
   1.djagno是同步框架还是异步框架,djagno 3.x以后支持异步
   2.同步框架:一个线程只处理一个请求
   3.异步框架:一个线程可以处理多个请求
   4.异步框架可以很显著的提高并发量

django的并发量是指usgi的线程数,线程的并发量就是协程,同步框架和异步框架对于用户来说,消耗的时间是一个样的。但异步框架的效率提高了。
    

image

flask介绍

Flask是一个基于python开发并且依赖jinja2模板和werkzeug WSGI服务的一个微型框架

jinja2 模板语法,django的dtl,非常像
Werkzeug WSGI 符合wsgi协议的web服务器,django使用的是wsgiref

# 安装:    pip install flask   
# 安装依赖: MarkupSafe, Werkzeug, Jinja2, flask
	-1.x 没有本质区别
     -2.x 没有本质区别,源码上动了,用起来一样

代码实现

"""wsgirf写web"""
from wsgiref.simple_server import make_server

##mya 等同于django
def mya(environ, start_response):
    #把environ包装成了request
    print(environ)
    start_response('200 OK', [('Content-Type', 'text/html')])
    if environ.get('PATH_INFO') == '/index':
        with open('index.html','rb') as f:
            data=f.read()

    elif environ.get('PATH_INFO') == '/login':
        with open('login.html', 'rb') as f:
            data = f.read()
    else:
        data=b'<h1>Hello, web!</h1>'
    return [data]  # 做成了response

if __name__ == '__main__':
    myserver = make_server('', 8008, mya)  #mya(environ, start_response)
    print('监听8010')
    myserver.serve_forever()
    
    
""" 使用werkzeug写web """ 
from werkzeug.wrappers import Request, Response
@Request.application
def hello(request):
    return Response('Hello World!')


if __name__ == '__main__':
    from werkzeug.serving import run_simple

    run_simple('localhost', 4000, hello) # hello是上面的函数

快速使用

from flask import Flask

app = Flask(__name__)  #__name__其实就是字符串

# app=Flask('test')

# 注册路由----路由在装饰器上
@app.route('/index')
def index():
    return 'hello web'

@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    # app.run('127.0.0.1',5000)
    app.run()

登录、显示用户信息小案例

flask小知识

1.注册路由
    app.route(路径,method=[请求方式get,post])
2.新手四件套:
    -render_template   渲染模板  跟django有区别
    -redirect    重定向
    -return  字符串 返回字符串---jsonify格式字符串
3.请求的request对象,是全局的request对象,直接导入使用即可,在不同的视图函数不会混乱
    request.method   请求方式
    request.form     post请求的body体的内容转换成了字典
4.session  全局的直接导入使用即可,一定要指定秘钥app.secret_key='shashoashofisj'
     放值:session['name']='kimi'
     取值: session.get('name')
5.模板的渲染
    -兼容django的dtl
    -更强大,可以加括号,字典取值多样(dict.get('')/dict['']/dict./dict.items()),而django只能dict.
    -{% for %}
6.转换器@app.route('/detail/<int:pk>')

案例

login.html

<form method="post">
    <p>username: <input type="text" name="username"></p>
    <p>password: <input type="text" name="password"></p>
    <input type="submit" value="登录">{{ error }}
</form>

home.html

<table>
    <h1>用户列表</h1>
    {% for k,v in user_dict.items() %}
    <tr>
        <td>{{ k }}</td>
        <td>{{ v.name }}</td>
        <td>{{ v['name'] }}</td>
        <td>{{ v.get('name') }}</td>
        <td><a href="/detail/{{ k }}">查看详细</a></td>
    </tr>
    {% endfor %}

</table>

detail.html

<body>
<p>姓名:{{ user.name }}</p>
<p>性别:{{ user.gender }}</p>
<p>年龄:{{ user.age }}</p>
<p>详情:{{ user.text }}</p>

</body>

app.py

from flask import Flask, request, render_template, redirect, session, jsonify

app = Flask(__name__)  # __name__其实就是字符串

# 要使用session,必须设置秘钥,秘钥是配置信息
# app.secret_key = 'asdfasdfa33aef3aefads'
app.secret_key = 'dsvsgsafdfdfsafefsdcz'

# app=Flask('test')

USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}


# 注册路由----路由在装饰器上
# 1 创建templates文件夹,写login.html
@app.route('/login', methods=['GET', 'POST'])
def login():
    # 没有request对象,使用全局的request
    # get请求,返回模板
    if request.method == 'GET':
        return render_template('login.html')  # 新手四件套之一:返回模板
    else:
        # post请求,校验数据
        # 取出前端传入的用户名密码,校验
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'kimi' and password == '123':
            # 登录成功,保存登录状态 重定向到跟路径   新手四件套之一:重定向
            # 保存到session中,session是全局的
            session['name'] = username
            return redirect('/')
        else:
            return render_template('login.html', error='用户名或密码错误')  # 注意跟django的render区分,要模板渲染的数据,直接key=value传即可


@app.route('/')
def home():
    # 校验,登录成功,才能过来,不登录,重定向到登录页面
    if session.get('name'):
        return render_template('home.html', user_dict=USERS)
    else:
        return redirect('/login')


@app.route('/detail/<int:pk>')
def detail(pk):
    if session.get('name'):  # 有值说明登录了,没有值说明没有登录
        user_detail = USERS.get(pk)
        return render_template('detail.html', user=user_detail)
    else:
        return redirect('/login')

@app.route('/test')
def test():
    return jsonify([{'name':'kimi','age':19}])

if __name__ == '__main__':
    # app.run('127.0.0.1',5000)
    app.run()

配置文件方式

django的配置settings,分为开发环境和测试环境两个环境脚本,而flask配置方式多种:

方式一

文件直接设置debug和秘钥模式,仅这两种可以设置

 app.debug=True  # 调试模式,提示信息更详细,修改代码不需要重启,自动重启
 app.secret_key='dasdfasdfasd'  # 秘钥,只能 放debug和secret_key

方式二

# 直接使用app.config设置
app.config['DEBUG']=True
app.config['SECRET_KEY']='sdfasdfasd'
print(app.config)

方式三

# 使用py文件(不常用)
app.config.from_pyfile("settings.py")
 print(app.config)

方式四

# 常用的,使用类的方式
app.config.from_object(settings.DevelopmentConfig)
app.config.from_object(settings.ProductionConfig)
print(app.config)

# settings

class BASE(object):
    DEBUG=True
class ProductionConfig(BASE):
    DETABASE_URI='mysql://user@localhost/foo'
    SECRET_KEY='HSHHSHSHSH'
class DevelopmentConfig(BASE):
    DETABASE_URI='mysql://user@localhost/foo'
    SECRET_KEY='HOSHSHOHS'

其他方式

#通过环境变量配置
app.config.from_envvar("环境变量名称")

 # json
app.config.from_json("json文件名称")
JSON文件名称,必须是json格式,因为内部会执行json.loads

# 字典格式---》配置中心
app.config.from_mapping({'DEBUG': True})


# 内置的配置字段,其他可以写自己的,比如 redis的连接地址,mysql的连接地址
	-DEBUG
    -SECRET_KEY
    -SESSION_COOKIE_NAME
    -PERMANENT_SESSION_LIFETIME

路由系统

1.路由本质

django中配置路由,是在urls.py中书写path,

image
)

flask是基于装饰器的,大部分都用装饰器来做,少量可以抽取到一个urls.py中

image

路由源码分析

@app.route('/login')
def index():
    pass

1.本质是执行了index=app.route('/login')(index)
2.app.route('/login')的执行结果是 decorator函数
    -rule是路径
    -其他参数都给了options
3.执行decorator(index)
    def decorator(f: T_route) -> T_route:
        """
        # f是index
    	endpoint = options.pop("endpoint", None) # 目前没有endpoint,是None
        # 核心,本质--》self就是实例化得到的app对象,flask对象
        # app对象中有个方法add_url_rule,这是在添加路由
        # 不使用装饰器,自己注册路由
        self.add_url_rule(rule, endpoint, f, **options)
        return f
        """
            endpoint = options.pop("endpoint", None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f

# 原本的函数  是一个闭包函数
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)
          return f

    return decorator
# 可以不使用装饰器的方式,注册路由
app.add_url_rule('/', endpoint=None, view_func=home, methods=['GET'])

flask路由的本质是app对象的add_url_rule完成路由的注册

2路由参数

# rule             URL规则
# view_func        视图函数名称
# defaults = None  默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}为函数提供参数
# endpoint = None, 路径的别名,名称,用于反向解析URL,即: url_for('名称')
# methods = None, 允许的请求方式,如:["GET", "POST"]


#对URL最后的 / 符号是否严格要求strict_slashes
strict_slashes = None
    '''
        @app.route('/index', strict_slashes=False)
        #访问http://www.xx.com/index/ 或http://www.xx.com/index均可
        @app.route('/index', strict_slashes=True)
        #仅访问http://www.xx.com/index
    '''

#重定向到指定地址redirect_to
redirect_to = None, 
    '''
        @app.route('/index/<int:nid>', redirect_to='/home/<nid>')
    '''
    
    
 # 需要记住的
    # rule  
    # view_func   
    # defaults
    # endpoint
    # methods

3.转换器

 'default':          UnicodeConverter,
 'string':           UnicodeConverter,
 'any':              AnyConverter,
 'path':             PathConverter,
 'int':              IntegerConverter,
 'float':            FloatConverter,
 'uuid':             UUIDConverter,
    
 # 了解:让路由支持正则(忽略掉)

标签:__,return,name,Flask,app,route,路由
From: https://www.cnblogs.com/zhanglanhua/p/17278879.html

相关文章

  • flask-介绍、配置文件、路由系统
    1.flask和pythonweb框架介绍1.1框架介绍:django:大而全,内置的app多,第三方app也多Flask:小而精,没有过多的内置组件,只完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能web.py:是一个小巧灵活的Python框架,它简单而且功能强大(国内几乎没有用的)fastapi:python的异步web框架,......
  • Flask快速入门day 01(flask介绍、快速使用、配置文件、路由系统)
    目录Flask框架前言:一、flask介绍1、介绍2、使用两种协议编写web二、flask快速使用1、快速使用:2、使用flask编写登录小案例2.1login.html2.2home.html2.3detail.html2.4py文件三、flask配置文件1、配置文件的几种方式方式一:直接编写方式二:使用app.config方式三:使用py文件,然后......
  • Flask框架1
    今日内容概要flask和其他pythonweb框架介绍flask快速使用登陆显示用户信息小案例配置文件方式路由系统今日内容概要flask和其他pythonweb框架介绍pythonweb框架的本质都一样1.同步框架 django大而全内置的app多第三方app也多 flask小而精没有过多的内置组件......
  • Flask入门
    Flask和pythonweb框架介绍pythonweb框架,本质都一样 -django:大而全,内置的app多,第三方app也多 -flaks:小而精,没有过多的内置组件,值完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能 -web.py:是一个小巧灵活的python框架,它简单而且功能强大(国内几乎没有用......
  • flask
    今日内容1Flask和pythonweb框架介绍#pythonweb框架,本质都一样 -django:大而全,内置的app多,第三方app也多-Flask:小而精,没有过多的内置组件,只完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能-web.py:是一个小巧灵活的Python框架,它简单而且功能强大(国内几......
  • Flask框架 之Flask-login用户登录
    文档:https://flask-login.readthedocs.io/en/latest/安装:pipinstallflask-login一、效果图  二、示例代码fromflaskimportFlask,render_template,url_for,redirect,flashfromflask_loginimportLoginManager,login_required,UserMixin,login_user,lo......
  • Flask框架 之使用蓝图实现模块划分
     一、示例代码run.pyfromappimportcreate_appif__name__=='__main__':app=create_app()app.run(debug=True,port=5000)__init__.pyfromflaskimportFlaskfromapp.controllersimportconfig_blueprintdefcreate_app():app=Fla......
  • Flask框架 之Flask-WTF表单扩展
    pipinstallflask-wtf 一、WTForms支持的HTML标准字段字段对象说明StringField文本字段TextAreaField多行文本字段PasswordField密码文本字段Hid......
  • Flask框架 之Flask-SQLAlchemy操作数据库
    一、代码fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyfromsqlalchemyimportdescclassConfig(object):'''sqlalchemy参数配置'''......
  • flask-migrate中的MigrateCommand在新版本中被弃用了相关解决方案
    在__init__.py中找不到引用"MigrateCommand"、Cannotfindreference‘MigrateCommand’in‘__inti__.py’原因:flask_migrate模块安装版本不匹配,flask_migrate版......