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 筆記 管理工做目錄 -- 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 reset ./<filename>
創建bug分支,出了bug進行修改,flask
先進行建立一個倉庫,ssh比https的要快,瀏覽器
C:\Users\dell\.ssh 公鑰私鑰文件位置,
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)
@app.route('/index/<nid>',methods=['GET','POST']) def index(nid): return url_for('index',nid=nid)
先下載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."
先下載,
pip3 install wtfomrs
邏輯部分代碼
#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'
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>
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
參考博客
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,))) #不要忘了加逗號