澳门至尊网站-首页

您的位置:澳门至尊网站 > 软件综合 > Python之flask总结

Python之flask总结

2019-10-25 00:06

一、flask

     a、Flask是一个基于Python开辟况兼信任jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于收纳http须要并对须要进行预管理,然后触发Flask框架,开辟人士基于Flask框架提供的效果对央浼进行相应的拍卖,并赶回给客户,要是要回去给顾客复杂的内容时,须要依附jinja2模板来促成对模板的拍卖,即:将模板和数量开展渲染,将渲染后的字符串再次来到给客商浏览器

     b、“微”(micro) 并不代表你要求把一切 Web 应用塞进单个 Python 文件(即使真正能够 ),也不意味 Flask 在效果与利益上富有欠缺。微框架中的“微”意味着 Flask 目的在于保持中央简单而易于扩大。Flask 不会替你做出太多决策——举个例子动用何种数据库。而那么些 Flask 所挑选的——比方利用何种模板引擎——则非常轻松替换。除却的百分百都由可由你左右。如此,Flask 可以与你毛将焉附。

     c、默许情形下,Flask 不含有数据库抽象层、表单验证,或是此外任何本来就有两种库能够胜任的作用。可是,Flask 扶植用扩展来给使用加多那么些效能,就像是是 Flask 本身达成的同风流洒脱。众多的恢弘提供了数据库集成、表单验证、上传管理、有滋有味标怒放认证手艺等作用。Flask 大概是“细小”的,但它已未雨策动幸好要求繁琐的生育蒙受中投入使用。

二、安装

      a、安装:pip3 install flask**

三、设想意况

**      a、安装: pip3 install virtualenv**

      b、# 制造虚构情形 virtualenv env1

      c、# 步向虚构遇到 Scripts/activate

      d、 # 退出设想遇到 Scripts/deactivate

四、flask框架**

**      a、简介:轻量级框架                      Django:无socket、中间件、路由系统、视图(CBV,FBV)、 模板、ORM、cookie、Session、Admin、Form、缓存、复信号、系列化....                      Flask:无socket、中间件(扩张)、路由系统、视图(CBV)、第三方模板(jinja2)、cookie、Session弱爆了**

**      b、 什么是wsgi?
                           Web服务网管接口,合同。**

**      c、Flask信任四个落实了WSGI合同的模块:werkzeug**

五、flask

       a、 -依赖于wsgi模块:wsgiref,werkzeug,wsgi

       b、  -实例化Flask对象

                  -静态文件前缀  /xxx

                  -静态文件目录

                  -模板路线

        c、 增添路由关系      

                  -将 Rule(url和视图函数)增加到Flask对象的url_map字段中

                  -三种增加路由的方法

        d、request

                 -request.form

                 -request.args 

六、基本选取

from flask import Flask

# 实例化Flask对象
app = Flask(__name__)

# 生成路由关系,并把关系保存到某个地方,app对象的 url_map字段中
@app.route('/xxxx')  # @decorator
def index():
    return "Index"

# def index():
#     return "Index"
# app.add_url_rule('/xxx', "n1", index)

if __name__ == '__main__':
    # 启动程序,监听用户请求
    # 一旦请求到来,执行 app.__call__方法
    # 封装用户请求
    # 进行路由匹配
    app.run()

     a、保留session的数量存到了浏览器上,
        - 优点:缓解了服务端的压力
        - 缺点:不安全

     b、路由系统:  

  • @app.route('/post/<path:path>')
  • @app.route('/login', methods=['GET', 'POST'])
  • @app.route('/user/<username>')
  • @app.route('/post/<int:post_id>')
  • @app.route('/post/<float:post_id>')

七、路由系统**

**     a、  -可传唱参数**     **

            @app.route('/user/<username>')

            @qpp.route('/post/<int:post_id>',methods=['GET','POST'],endpoint='fff')

     b、反向生成UQashqaiL:url_for**

     c、恢宏Flask的路由系统,让它辅助正则:**

from flask import Flask,url_for

                app = Flask(__name__)

                # 定义转换的类
                from werkzeug.routing import BaseConverter
                class RegexConverter(BaseConverter):
                    """
                    自定义URL匹配正则表达式
                    """

                    def __init__(self, map, regex):
                        super(RegexConverter, self).__init__(map)
                        self.regex = regex

                    def to_python(self, value):
                        """
                        路由匹配时,匹配成功后传递给视图函数中参数的值
                        :param value: 
                        :return: 
                        """
                        return int(value)

                    def to_url(self, value):
                        """
                        使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
                        :param value: 
                        :return: 
                        """
                        val = super(RegexConverter, self).to_url(value)
                        return val

                # 添加到converts中
                app.url_map.converters['xxx'] = RegexConverter

                # 进行使用
                @app.route('/index/<xxx("d+"):nid>',endpoint='xx')
                def index(nid):
                    url_for('xx',nid=123)
                    return "Index"

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

八、伏乞响应

from flask import Flask
    from flask import request
    from flask import render_template
    from flask import redirect
    from flask import make_response

    app = Flask(__name__)


    @app.route('/login.html', methods=['GET', "POST"])
    def login():

        # 请求相关信息
        # request.method
        # request.args
        # request.form
        # request.values
        # request.cookies
        # request.headers
        # request.path
        # request.full_path
        # request.script_root
        # request.url
        # request.base_url
        # request.url_root
        # request.host_url
        # request.host
        # request.files
        # obj = request.files['the_file_name']
        # obj.save('/var/www/uploads/' + secure_filename(f.filename))

        # 响应相关信息
        # return "字符串"
        # return render_template('html模板路径',**{})
        # return redirect('/index.html')

        # response = make_response(render_template('index.html'))
        # response是flask.wrappers.Response类型
        # response.delete_cookie('key')
        # response.set_cookie('key', 'value')
        # response.headers['X-Something'] = 'A value'
        # return response


        return "内容"

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

    a、在django中用make_safe而在Flask中用make_response

九、模板语言   **

     a、模板的选用

               Flask使用的是Jinja2模板,所以其语法和Django一点差距也未有

     b、自定义模板方法

               Flask中自定义模板方法的方法和Bottle相仿,创制二个函数并经过参数的款式传播render_template,

十、session 

      a、 -session是还是不是还应该有此外措施?

                     -它与字典方法同样

      b、  -session超时时间怎么着设置:**

app.config['SESSION_COOKIE_NAME'] = 'session_lvning'
            """
            'SESSION_COOKIE_NAME':                  'session',
            'SESSION_COOKIE_DOMAIN':                None,
            'SESSION_COOKIE_PATH':                  None,
            'SESSION_COOKIE_HTTPONLY':              True,
            'SESSION_COOKIE_SECURE':                False,
            'SESSION_REFRESH_EACH_REQUEST':         True,
            'PERMANENT_SESSION_LIFETIME':           timedelta(days=31)

     c、除诉求对象之外,还可能有多少个 session 对象。它同意你在分歧诉求间存储特定顾客的信息。它是在 Cookies 的功底上达成的,而且对 Cookies 实行密钥具名要动用会话,你须求设置三个密钥。

     d、

  • 设置:session['username'] = 'xxx'

  • 删除:session.pop('username', None)

十一、闪现(flash)**

     a、session从在在服务端的多个字典中,session保存的多少取一次,它照旧会有。而flash是依照session创设的,flash帮助在里面放值,只要在内部取值它就能并未有。闪现就是**

     b、在session的底子上,把它的值真实的放在session上,当去它的时候不但把它的值取走,还把session的东西去掉。

十二、蓝图**

     a、蓝图用于为使用提供目录划分**

  • 蓝图URL前缀:xxx = Blueprint('account', __name__,url_prefix='/xxx')
  • 蓝图子域名:xxx = Blueprint('account', __name__,subdomain='admin')
    # 前提需求给配备SE科雷傲VE猎豹CS6_NAME: app.config['SERVER_NAME'] = 'wupeiqi.com:5000'
    # 访问时:admin.wupeiqi.com:5000/login.html

十三、DBUtils**

      a、DBUtils是Python的叁个用来落到实处数据库连接池的模块。**

      b、连接池的三种方式:**

            (1)、第大器晚成种情势:

                                 它的症结:每一回号令每每创设数据库的链接,链接的次数太多

             (2)、第三种格局:

                                 它的缺欠:无法支撑并发

              (3)、第三种情势:

                                它是基于DBUtils达成数据库连接池

                                        -为每一个线程创造贰个链接,该线程关闭时,不是的确的关闭,本线程再度调用时,仍旧利用的最开首的开创的链接,知道线程终止,数据库链接才关闭

                                       -成立二个连接池(13个链接),为具有线程提供链接,使用时来展开获取,使用完成时,再度放回到连接池。

       c、DBUtils的应用:**

import time
import pymysql
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,  # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='pooldb',
    charset='utf8'
)

十四、session

      a、 session和cookie的法规和区别:

               cookie是保存在浏览器上的键值对
               session是存在服务端的键值对(服务端的session正是八个大字典,字典中是随机字符串)(session与request原理相同)(session原理跟上下文也会有关系)

               session依赖于cookie存在**

**      b、  session流程**      **

当请求第一次进来,生成随机字符串
                  -发给用户cookie
                  -保存到session字典中时
                  它调用stark将随机字符串和对应的值放到local
                视图函数
                 -使用时导入用top(它拿的是session)
                     session=LocalProxy(partile(_lookup_req_object,'session '))
               请求处理完毕:
                     内存处理完毕后,将session做持久化(session存到数据库,存到Redis,存到加密的cookie中)

十五、session源码解析

     a、先执行Flask的__call__方法 ,调用出来wsgi_app,它先做request的上下文做完,央浼刚进来到push中,它先管理request将号令相关的多少,然后增添到了local中,

     b、 紧接着管理session(将RequestContext对象(request,session)增加到local中),request(将request音信打包到Request(environ)对象并复制给requestContext 对                       象),然后拿走cookie中的随机字符串,核实是还是不是有,未有就改动。依据随意字符串,获取服务端session保存的值。把session放到内部存款和储蓄器中,

     c、  执行wsgi_app方法下边包车型客车视图函数。实施完视图函数重返到full_dispatch_requesthong ,触发只举行贰回的装饰器中(触发Flask随机信号),

     d、  推行完这么些装饰器,紧接着试行下边包车型大巴独特的装饰器,纵然这一个特别装饰器没有再次回到值,那么rv=None,假诺有重回值,页面时就体现这一个再次回到值,

     e、若无再次回到值,触发实施那一个视图函数,拿再次来到值。央浼实施完重临后,调用finalize_request,对它的重返值进行打包。

十六、Flask和Django的区别 

     a、恳请相关的数额           

                  -Django:参数

                  -Flask:    基于Local,LocalStark对象

     b、 两个央求进入会不会搅乱            

                  -单线程

                  -多线程

                  -协程

                    解决: from greenlet import getcurrent as get_ident

十七、**Flask**信号

    a、 Flask框架中的功率信号基于blinker**

    b、安装: pip3 install blinker**

    c、拾三个非实信号

1. 内置信号
            10个信号:
                2. request_started = _signals.signal('request-started')                # 请求到来前执行
                5. request_finished = _signals.signal('request-finished')              # 请求结束后执行

                3. before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行
                4. template_rendered = _signals.signal('template-rendered')            # 模板渲染后执行

                2/3/4/5或不执行 got_request_exception = _signals.signal('got-request-exception')    # 请求执行出现异常时执行

                6. request_tearing_down = _signals.signal('request-tearing-down')      # 请求执行完毕后自动执行(无论成功与否)
                7. appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 请求上下文执行完毕后自动执行(无论成功与否)


                1. appcontext_pushed = _signals.signal('appcontext-pushed')            # 请求app上下文push时执行

                8. appcontext_popped = _signals.signal('appcontext-popped')            # 请求上下文pop时执行

                message_flashed = _signals.signal('message-flashed')                   # 调用flask在其中添加数据时,自动触发

     d、flask功率信号本生自个儿未有,用的是人家的,并且这一个时限信号通过装饰器全体得以取代了的,但是Django里面有些别饶风趣的
正是那么些model操作根本未有装饰器,就是同过内置的时域信号来完成的

十八、django内置的数字信号

Request/response signals
                    request_started             # 请求到来前,自动触发
                    request_finished            # 请求结束后,自动触发
                    got_request_exception       # 请求异常后,自动触发

                Model signals
                    pre_init                    # django的modal执行其构造方法前,自动触发
                    post_init                   # django的modal执行其构造方法后,自动触发

                    pre_save                    # django的modal对象保存前,自动触发
                    post_save                   # django的modal对象保存后,自动触发

                    pre_delete                  # django的modal对象删除前,自动触发
                    post_delete                 # django的modal对象删除后,自动触发

                    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发

                    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发

                Management signals
                    pre_migrate                 # 执行migrate命令前,自动触发
                    post_migrate                # 执行migrate命令后,自动触发

                Test signals
                    setting_changed             # 使用test测试修改配置文件时,自动触发
                    template_rendered           # 使用test测试渲染模板时,自动触发
                Database Wrappers
                    connection_created          # 创建数据库连接时,自动触发

十九、Wtform

    a、WTForms是两个支撑八个web框架的form组件,主要用以对客户央求数据开展表明。

    b、安装: pip3 install wtform

    c、用途:**

**       1、顾客登入注册**

               当顾客登入时候,须求对客商提交的顾客名和密码举办多样格式校验。如:

              客户不可能为空;顾客长度必得大于6;

              密码不能够为空;密码长度必需超过12;密码必得带有 字母、数字、特殊字符等(自定义正则);

图片 1图片 2

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder='templates')
app.debug = True


class LoginForm(Form):
    name = simple.StringField(
        label='用户名',
        validators=[
            validators.DataRequired(message='用户名不能为空.'),
            validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
        ],
        widget=widgets.TextInput(),
        render_kw={'class': 'form-control'}

    )
    pwd = simple.PasswordField(
        label='密码',
        validators=[
            validators.DataRequired(message='密码不能为空.'),
            validators.Length(min=8, message='用户名长度必须大于%(min)d'),
            validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!%*?&])[A-Za-zd$@$!%*?&]{8,}",
                              message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')

        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )



@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        form = LoginForm()
        return render_template('login.html', form=form)
    else:
        form = LoginForm(formdata=request.form)
        if form.validate():
            print('用户提交数据通过格式验证,提交的值为:', form.data)
        else:
            print(form.errors)
        return render_template('login.html', form=form)

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

app.py

图片 3图片 4

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form method="post">
    <!--<input type="text" name="name">-->
    <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p>

    <!--<input type="password" name="pwd">-->
    <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p>
    <input type="submit" value="提交">
</form>
</body>
</html>

login

二十、SQLALchemy

    a、介绍 :      

           SQLALchemy是一个依照Python达成的ORM框架。该框架是创建在DB API之上,使用关系对象映射实行数据库操作

           简言之便正是:将类和对象转变来SQL,然后使用数据API施行SQL并收获实施的结果

    b、安装: pip3 install SQLALchemy

    c、组成都部队分**

 engine,                                     框架的引擎

     Connection  Pooling  ,                      数据库连接池

     Dialect,                                    选择链接数据库的DB  API种类

     Schema /Types,                              架构和类型     

     SQL Exprression Language,                   SQL表达式语言

    d、SQLALcheam省内无法操作数据库,其必得来pymysql等级三方插件, Dialect用于数据API的沟通,依据配置文件的不如**

调用差异的数据库API,进而完结对数据库的操作

MySQL-Python
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>

pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

MySQL-Connector
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>

cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html

 

 

  

 

本文由澳门至尊网站发布于软件综合,转载请注明出处:Python之flask总结

关键词: