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示例代码
相关文章
相关标签/搜索