1. 程式人生 > >flask 中的常用組件的使用 ,virtualenv組件和 pipreqs組件

flask 中的常用組件的使用 ,virtualenv組件和 pipreqs組件

target config param 表單 range fun 線程 safe required

一 。 flask 中連接的數據庫的組件 DButils

  

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(
    creator=pymysql,  # 使用鏈接數據庫的模塊
    maxconnections=20,  # 連接池允許的最大連接數,0和None表示不限制連接數
    mincached=2,  # 初始化時,鏈接池中至少創建的空閑的鏈接,0表示不創建
    maxcached=5,  #
鏈接池中最多閑置的鏈接,0和None不限制 maxshared=0, # 鏈接池中最多共享的鏈接數量,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=123456, database=day116, charset=utf8 ) def func():
# 去連接池中獲取一個連接 conn = POOL.connection() cursor = conn.cursor() # cursor.execute(‘select * from users‘) print(開始去執行了) cursor.execute(select sleep(5)) result = cursor.fetchall() # 將連接返還到連接池中 conn.close() # print(result) def func2(): conn = POOL.connection() cursor = conn.cursor() # cursor.execute(‘select * from users‘) print(開始去執行了,2,3) cursor.execute(select sleep(5)) result = cursor.fetchall() # 將連接返還到連接池中 conn.close() # print(result) import threading # 多線程的模塊 for i in range(20): t = threading.Thread(target=func) t2 = threading.Thread(target=func2) t.start() t2.start()

二 。 flask 中的 flask-session 組件

  將Flask中的session由原來的默認寫到加密cookie中,改成放置到其他數據源,如:redis/memcached/filesystem/mongodb/sqlalchemy(數據庫

在 setttings 中設置的代碼

    SECRET_KEY = "asdfasdfasdf"
    SESSION_TYPE = redis
    SESSION_REDIS = Redis(host=127.0.0.1,port=6379)

在 app 中的代碼

from flask import Flask,session,request,redirect
from flask_session import Session  # 導入這個模塊
from .views.account import account 
from .views.code import code
from .views.student import student

def auth():
    """
    用戶認證
    :return:
    """
    if request.path == /login:
        return None
    user_info = session.get(user_info)
    if user_info:
        return None
    return redirect(/login)

def create_app():
    app = Flask(__name__)
    app.config.from_object(settings.DevelopmentConfig)

    app.register_blueprint(account)
    app.register_blueprint(code)
    app.register_blueprint(student)

    app.before_request(auth)
    Session(app)   #  把app對象傳進去

    return app

三 flask 中的 wtforms 組件:  

  跟Django中的form組件 一樣 都是用於做表單驗證

  

from wtforms.fields import simple
from wtforms.fields import html5
from wtforms.fields import core
from wtforms import widgets
from wtforms import validators
from wtforms import Form

from zzy.utils import sqlhelper


class ClsForm(Form):
    title = simple.StringField(
        label=名稱,
        widget=widgets.TextInput(),
        render_kw={class: form-control},
        validators=[
            validators.DataRequired(message=班級名稱不能為空)
        ],
    )



class TestForm(Form):
    name = simple.StringField(
        label=用戶名,
        validators=[
            validators.DataRequired()
        ],
        widget=widgets.TextInput(),
        render_kw={class: form-control}
    )
    """
    pwd = simple.PasswordField(
        label=‘密碼‘,
        validators=[
            validators.DataRequired(message=‘密碼不能為空.‘)
        ],
        widget=widgets.PasswordInput(),
        render_kw={‘class‘: ‘form-control‘}
    )

    pwd_confirm = simple.PasswordField(
        label=‘重復密碼‘,
        validators=[
            validators.DataRequired(message=‘重復密碼不能為空.‘),
            validators.EqualTo(‘pwd‘, message="兩次密碼輸入不一致")
        ],
        widget=widgets.PasswordInput(),
        render_kw={‘class‘: ‘form-control‘}
    )

    email = html5.EmailField(
        label=‘郵箱‘,
        validators=[
            validators.DataRequired(message=‘郵箱不能為空.‘),
            validators.Email(message=‘郵箱格式錯誤‘)
        ],
        widget=widgets.TextInput(input_type=‘email‘),
        render_kw={‘class‘: ‘form-control‘}
    )

    gender = core.RadioField(
        label=‘性別‘,
        choices=(
            (1, ‘男‘),
            (2, ‘女‘),
        ),
        coerce=int
    )
    city = core.SelectField(
        label=‘城市‘,
        choices=(
            (‘bj‘, ‘北京‘),
            (‘sh‘, ‘上海‘),
        )
    )

    hobby = core.SelectMultipleField(
        label=‘愛好‘,
        choices=(
            (1, ‘籃球‘),
            (2, ‘足球‘),
        ),
        coerce=int
    )

    favor = core.SelectMultipleField(
        label=‘喜好‘,
        choices=(
            (1, ‘籃球‘),
            (2, ‘足球‘),
        ),
        widget=widgets.ListWidget(prefix_label=False),
        option_widget=widgets.CheckboxInput(),
        coerce=int
    )
    """
    cls_id = core.SelectField(
        label=請選擇班級,
        # choices=(
        #     (‘bj‘, ‘北京‘),
        #     (‘sh‘, ‘上海‘),
        # )
        choices=[],
        coerce=int
    )

    def __init__(self, *args, **kwargs):
        super(TestForm, self).__init__(*args, **kwargs)

        self.cls_id.choices = sqlhelper.fetchall(sql=select id,title from classes,args=[],cur=None)

    def validate_name(self,field):
        """
        對name進行驗證時的鉤子函數
        :param field:
        :return:
        """
        if field != root:
            raise validators.ValidationError("用戶名必須是root")

不限語言的

四 pipreqs 組件:

  

       安裝: 
            pip3 install pipreqs 
            
        使用: 
            pipreqs ./ --encoding=utf-8          
     # 執行完生產一個 requirements.txt 文件 ,裏面記錄了此項目的所有模塊和版本,
        pip3 install -r requirements.txt 可以下載文件裏的所有模塊

不限語言的

五:virtualenv

  創建虛擬的環境

  

    安裝: 
            pip3 install virtualenv
            
        命令創建虛擬環境: 
            virtualenv 虛擬環境的名稱
            
            cd 虛擬環境目錄 
            
            activate 激活虛擬環境
            
            
            pip3 install django==1.7 
            
            
            deactivate 退出虛擬環境

flask 中的常用組件的使用 ,virtualenv組件和 pipreqs組件