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,))) #不要忘了加逗号