开发人员基于Flask框架提供的功能对请求进行相应的处理

一、flask

   
 a、Flask是二个基于Python开采况且重视jinja2模板和Werkzeug
WSGI服务的一个Mini框架,对于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、反向生成U奥迪Q7L: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_开发人员基于Flask框架提供的功能对请求进行相应的处理。safe而在Flask中用make_response

开发人员基于Flask框架提供的功能对请求进行相应的处理。九、模板语言   **

     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的事物去掉。

十二、蓝图**

开发人员基于Flask框架提供的功能对请求进行相应的处理。     a、蓝图用于为运用提供目录划分**

  • 开发人员基于Flask框架提供的功能对请求进行相应的处理。蓝图URL前缀:xxx = Blueprint(‘account’,
    __name__,url_prefix=’/xxx’)
  • 蓝图子域名:xxx = Blueprint(‘account’,
    __name__,subdomain=’admin’)

    # 前提须要给配备SEHavalVE纳瓦拉_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-z\d$@$!%*?&]{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

 

 

  

 

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图