3,Flask-CBC-Session-Forms-DBUtils-Git使用,

3,Flask-CBC-Session-Forms-DBUtils-Git使用,html

 

安裝flask-session時,報錯,沒有和合適的版本能夠用,mysql

那就網上下載,把須要的包下載下來,放在F:\Python36\Lib\site-packages,重點是路徑:Lib\site-packages,及能夠用了,linux

 

將本地分支ceshi1的代碼推到遠端test的分支上
git push -u origin ceshi1:test

 

 

Git

筆記git

Git 筆記
管理工做目錄
    -- mkdir xxx
    -- cd xxxx
    -- git init   (.git) 執行以後多了一個.git文件,證實git已經管理起工做目錄了,
    -- git status  查看工做樹狀態
    -- git log   查看提交記錄
    -- git log --oneline 跟git log 對比操做看一下,顯示在一行,
    -- git reflog   查看以前全部的操做記錄
Git 三個狀態切換
    工做區   暫存區  本地倉庫
    -- git add ./<filename>  工做區到暫存區
    -- git commit -m "寫備註"   暫存區到本地倉庫
    -- git checkout ./<filename>  丟棄工做區的內容,就是寫入文件的內容,尚未進行git add
    -- git reset ./<filename>  從暫存區退到工做區
    -- git reset --hard/--soft <commit_id>  版本的回退  假如要從3版本回退到2版本,就輸入2版本的commit_id
            -- hard 丟棄內容
            -- soft 把內容放入暫存區
分支管理
    -- git branch <name>  建立分支
    -- git branch 查看分支
    -- git branch -d <name> 刪除分支
    -- git checkout <name>  切換分支
    -- git merge <name>  將name分支合併到當前分支
        -- 衝突只能手動解決
        -- 解決完衝突記得要提交

標籤管理
    -- git tag <name> <commit_id> 給指定的版本加標籤
    -- git tag  查看標籤
    -- git tag -d <name> 刪除標籤
    
    
    
    
    
    
遠程倉庫創建鏈接
    -- SSH 
      -- 1 本地生成公鑰私鑰
            在主用戶的根目錄下
      -- 2 把公鑰放入GitHub中
    -- 創建鏈接
        git remote add "遠程倉庫的別名" "遠程倉庫的地址https/ssh"
    -- 查看全部的遠程倉庫
        git remote
    -- 向遠程倉庫提交代碼
        git push -u 遠程倉庫別名 分支名
        注意 -u 第一次提交代碼的時候本地分支跟遠程倉庫的分支創建起鏈接
        git push 遠程倉庫別名 分支名
    -- 從遠程倉庫拉代碼
        git pull 遠程倉庫別名 分支名
    -- 遠程倉庫的代碼跟你最後push的代碼有變化的時候 push會失敗
        -- 先從遠程倉庫拉取代碼
        -- 手動解決衝突
        -- 提交到本地倉庫
        -- git push ....
流程
    -- 拉取本身分支的代碼
    -- 提交到測試分支
    -- 提交到遠程倉庫本身的分支
    -- 提交合並請求
    -- 由領導把你的分支合併到master
    -- 提交到保險分支
    -- 提交線上分支
當線上出bug
    -- 在master分支創建bug分支
    -- 在線上分支版本回退 
    -- 在bug分支 解決bug
rebase  合併提交記錄 保持記錄的整潔性


克隆項目
    -- git clone 地址
筆記

 

 

 

 參考博客github

https://blog.csdn.net/u011301203/article/details/53180427redis

 

git的三個狀態:工做區,暫存區,本地倉庫sql

 

 

 

git的操做用的是linux的命令,

 

進行版本的回退,即,提交到本地倉庫以後,再推到以前的狀態,數據庫

 

git reset ./<filename>:進行版本的回退,不加參數,版本回退,可是內容還在

git reset ./<filename>

 

 

 

git的分支

 

 

創建bug分支,出了bug進行修改,flask

 

got log時,若是日誌太多,一頁打印不下來,能夠回車,或者摁空格,接着顯示,顯示完以後,摁q退出

 

github 管理

 

先進行建立一個倉庫,ssh比https的要快,瀏覽器

C:\Users\dell\.ssh  公鑰私鑰文件位置,

 

 

 

 

Flask

CBV-代碼

from flask import Flask,views,render_template,request
app=Flask(__name__)
app.debug=True

def func():
    pass


class IndexView(views.MethodView):
    #decorators = [func,]  #定義裝飾器,來依次裝飾下面的函數
    #methods = ['GET','POST'] #容許哪些請求方式能夠進視圖函數,


    def get(self):
        return render_template('index.html')

    def post(self):
        user=request.form.get('username')
        pwd=request.form.get('password')
        if user=='dlh' and pwd=='ff':
            return 'ok'
        return '驗證錯誤'

    def delete(self):
        pass



app.add_url_rule('/index',view_func=IndexView.as_view(name='index'))

# @app.route('/index',methods=['GET','POST'])
# def index():
#     pass

app.run('0.0.0.0',5000)
cbv示例代碼

 

反向生成url

@app.route('/index/<nid>',methods=['GET','POST'])
def index(nid):
    return url_for('index',nid=nid)

 

 

Flask-session

 

先下載flask-sesson,而後進行導入,

 

瀏覽器裏存到session拿出來,對應的值,就是此處的:

b0e82f87-eb64-4f92-b3ef-2b41d329c1fc,到redis裏面,輸入下面的整個當key,拿到值,
key:session:b0e82f87-eb64-4f92-b3ef-2b41d329c1fc
value:"\x80\x03}q\x00(X\n\x00\x00\x00_permanentq\x01\x88X\x04\x00\x00\x00userq\x02X\x03\x00\x00\x00dwbq\x03u."

 

 

 

 

WTForms 

先下載,

pip3 install wtfomrs

 

wtforms代碼

 

默認id跟name等於字段名

邏輯部分代碼

#wtforms的代碼部分
# from wtforms.fields import simple,core   #講wtforms時導入的
# from wtforms import Form,validators,widgets   #這個Form是被繼承的類,

class LoginForm(Form):
    username=simple.StringField(
        label='用戶名',
        validators=[     #用來作校驗的
            validators.DataRequired(message='用戶名不能爲空'),
            validators.Length(max=16,min=6,message='不是太長就是過短,')
            # validators.EqualTo
        ],
        widget=widgets.TextInput(),  # 插件,用來輸入內容的,
        render_kw={'class': 'jwb'}  #對應標籤的類,以及類名,
    )


    pwd = simple.PasswordField(
        label='密碼',
        validators=[  # 用來作校驗的
            validators.DataRequired(message='密碼不能爲空'),
            validators.Length(max=16, min=6, message='不是太長就是過短')
            # validators.EqualTo
        ],
        widget=widgets.PasswordInput(),  # 插件,
        render_kw={'class': 'ywb'}
    )


@app.route('/login',methods=['GET','POST'],)
def login():
    if request.method=='GET':
        loginform=LoginForm()
        return render_template('login.html',loginform=loginform)
    else:
        loginform=LoginForm(request.form)
        if not loginform.validate():
            return render_template('login.html', loginform=loginform)
        print(request.form.get('username'))
        return 'ok'
py代碼

 

html代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    {{loginform.username.label}}:{{ loginform.username }}{{ loginform.username.errors[0] }}
    <br>
    {{loginform.pwd.label}}:{{ loginform.pwd }}{{ loginform.pwd.errors[0] }}
    <br>
    <input type="submit" value="登陸">
</form>
</body>
</html>
html代碼

 

py代碼

from flask import Flask,views,render_template,request,url_for
from flask import session  #講redis session是導入的
from flask_session import Session  #講redis session是導入的
from redis import Redis   #講redis session是導入的
from wtforms.fields import simple,core   #講wtforms時導入的
from wtforms import Form,validators,widgets   #這個Form是被繼承的類,


app=Flask(__name__)
app.debug=True
# app.secret_key='1212'

app.config['SESSION_TYPE']='redis'  #把session存放在redis裏面
app.config['SESSION_REDIS']=Redis('127.0.0.1',6379,db=15)  #存放的位置,
Session(app)




#wtforms的代碼部分
# from wtforms.fields import simple,core   #講wtforms時導入的
# from wtforms import Form,validators,widgets   #這個Form是被繼承的類,

class RegForm(Form):
    username = simple.StringField(
        label='用戶名',
        validators=[  # 用來作校驗的
            validators.DataRequired(message='用戶名不能爲空'),
            validators.Length(max=16, min=6, message='不是太長就是過短,')
            # validators.EqualTo
        ],
        widget=widgets.TextInput(),  # 插件,用來輸入內容的,
        render_kw={'class': 'jwb'}  # 對應標籤的類,以及類名,
    )

    pwd = simple.PasswordField(
        label='密碼',
        validators=[
            validators.DataRequired(message='密碼不能爲空'),
            validators.Length(max=16, min=6, message='不是太長就是過短')
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'ywb'}
    )

    repwd = simple.PasswordField(
        label='重複密碼',
        validators=[  # 用來作校驗的
            validators.EqualTo('pwd',message='兩次密碼不一致')
        ],
        widget=widgets.PasswordInput(),  # 插件,
        render_kw={'class': 'ywb'}
    )

    gender=core.RadioField(
        label='性別',
        validators=[
            validators.DataRequired(message='請選擇一個性別')
        ],
        coerce=int,
        choices=(
            (1,''),
            (2,'')
        ),
        default=1
    )

    hobby=core.SelectMultipleField(
        label='愛好',
        validators=[
            validators.Length(min=2,message='至少選2個')
        ],
        coerce=int,
        choices=(
            ((1,'xxx'),(2,'yyy'),(3,'zzzz'))
        ),
        default=(2,3)
    )



class LoginForm(Form):
    username=simple.StringField(
        label='用戶名',
        validators=[     #用來作校驗的
            validators.DataRequired(message='用戶名不能爲空'),
            validators.Length(max=16,min=6,message='不是太長就是過短,')
            # validators.EqualTo
        ],
        widget=widgets.TextInput(),  # 插件,用來輸入內容的,
        render_kw={'class': 'jwb'}  #對應標籤的類,以及類名,
    )

    pwd = simple.PasswordField(
        label='重複密碼',
        validators=[  # 用來作校驗的
            validators.DataRequired(message='密碼不能爲空'),
            validators.Length(max=16, min=6, message='不是太長就是過短')
            # validators.EqualTo
        ],
        widget=widgets.PasswordInput(),  # 插件,
        render_kw={'class': 'ywb'}
    )

@app.route('/reg',methods=['GET','POST'])
def reg():
    if request.method=='GET':
        reg=RegForm()
        return render_template('reg.html',reg=reg)
    else:
        reg=RegForm(request.form)
        if not reg.validate():
            return render_template('reg.html',reg=reg)
        return 'ok'


@app.route('/login',methods=['GET','POST'],)
def login():
    msg=''
    if request.method=='GET':
        loginform=LoginForm()
        return render_template('login.html',loginform=loginform)
    else:
        loginform=LoginForm(request.form)
        if not loginform.validate():
            return render_template('login.html', loginform=loginform)
        if loginform.username.data=='dlhlff' and loginform.pwd.data=='123456':
            return 'ok'
        msg='用戶名密碼錯誤'
        return  render_template('login.html', loginform=loginform,msg=msg)






# class IndexView(views.MethodView):
#     #decorators = [func,]  #定義裝飾器,來依次裝飾下面的函數
#     #methods = ['GET','POST'] #容許哪些請求方式能夠進視圖函數,
#
#
#     def get(self):
#         return render_template('index.html')
#
#     def post(self):
#         user=request.form.get('username')
#         pwd=request.form.get('password')
#         if user=='dlh' and pwd=='ff':
#             return 'ok'
#         return '驗證錯誤'
#
#     def delete(self):
#         pass



# app.add_url_rule('/index',view_func=IndexView.as_view(name='xxxx'))

# @app.route('/index/',methods=['GET','POST'],)
# def index():
#     if session.get('user'):
#         return session.get('user')
#     session['user'] = 'dwb'
#     return 'session'

app.run()
示例代碼

 

 

DBUtils

先下載dbutils

參考博客

http://www.javashuo.com/article/p-rtbkjgon-gz.html

 

代碼示例

import pymysql
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
    # 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='789',
    database='s13db',
    charset='utf8'
)


def func():
    # 檢測當前正在運行鏈接數的是否小於最大連接數,若是不小於則:等待或報raise TooManyConnections異常
    # 不然
    # 則優先去初始化時建立的連接中獲取連接 SteadyDBConnection。
    # 而後將SteadyDBConnection對象封裝到PooledDedicatedDBConnection中並返回。
    # 若是最開始建立的連接沒有連接,則去建立一個SteadyDBConnection對象,再封裝到PooledDedicatedDBConnection中並返回。
    # 一旦關閉連接後,鏈接就返回到鏈接池讓後續線程繼續使用。
    conn = POOL.connection()

    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute('select * from tb1')
    result = cursor.fetchall()
    conn.close()



# def fetch_one(uid):
#     conn=POOL.connection()
#     cursor=conn.cursor(pymysql.cursors.DictCursor)
#     cursor.execute('select * from users where id=%s ' % uid)
#     result=cursor.fetchall()
#
#     conn.close()
#     return result
#
# print(fetch_one(2))

# 改進版


def fetch_one(sql,args=()):#args=()  後面跟的是元組
    conn=POOL.connection()
    cursor=conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute(sql,args)
    result=cursor.fetchall()

    conn.close()
    return result

sql="select * from users where age=%s"
print(fetch_one(sql,(15,)))  #不要忘了加逗號
dbutils示例代碼
相關文章
相關標籤/搜索