《Flask web開發》筆記4:數據庫

1、實現功能:經過web表單生成登陸界面、當輸入的用戶名不在後臺數據庫裏時,加進去;在時,顯示Happy see you again樣式;html

      1.數據庫引擎:MySQL (安裝沒有要求路徑,我是用以前的沒動)mysql

      2.數據庫框架: Flask-SQLAlchemy(書上推薦,直接pip install  Flask-SQLAlchemy 就行)web

      

2、 Flask-SQLAlchemy建一個簡單的表:sql

 

      aa.py:shell

# coding: utf-8
from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root@localhost/yxctest'       #MySQL數據庫UILmysql://username:password@hostname/database
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True#實時更新

db = SQLAlchemy(app)  #實例化db
manager = Manager(app)

class User(db.Model):
    __tablename__ = 'users'    #表名
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(320), unique=True)
    password = db.Column(db.String(32), nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

if __name__ == '__main__':
    manager.run()

而後在doc輸入 Python aa.py shell數據庫

接着就能夠對這個表進行操做了:flask

           from aa import db、from aa import User、db.create_all()、user1 = User(username = 'yxc',email='123@qq.com',password='123123')bootstrap

           以上都是doc指令,功能是導入、建表、插入行等;session

 

3、實現步驟一中的功能:app

很簡單,就把此次的建數據庫的代碼和上一節建Web表單合併一下:

 

bb.py:

# coding: utf-8

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

from flask import Flask, render_template,url_for,session,redirect,flash  
from flask_script import Manager  
from flask_bootstrap import Bootstrap  
from flask_moment import Moment  
from flask_wtf import Form  
from wtforms import StringField, SubmitField  
from wtforms.validators import Required 
from flask_sqlalchemy import SQLAlchemy   #這裏導入框架

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root@localhost/yxctest'     #本身的MySQL帳戶和創建的表
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
#app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)           #db實例
bootstrap = Bootstrap(app)
app.secret_key = '1234567'

class NameForm(Form):   #Web表中定義的幾個片斷
    name = StringField('What is your name?', validators=[Required()])
    email = StringField('What is your email', validators=[Required()])
    password = StringField('What is your password', validators=[Required()])
    submit= SubmitField('Submit')


class User(db.Model):     #定義的數據庫的表
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(320), unique=True)
    password = db.Column(db.String(32), nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username





@app.route('/', methods=['GET', 'POST'])

def index():

    form = NameForm()
    if form.validate_on_submit:
        user = User.query.filter_by(username = form.name.data).first()#查詢語句,精確查詢輸入的name和數據庫表中的name比對
        if user is None:
            user = User(username = form.name.data,email=form.email.data,password=form.password.data)#若是不存在,則插入一行
            db.session.add(user)
            db.session.commit()#這兩行是必須的
            session['known'] = False
        else:
            session['known'] = True

        session['name']=form.name.data
        form.name.data = ''
    return render_template('index.html',form=form,name=session.get('name'),known = session.get('known',False))



if __name__ == '__main__':
    app.run(debug=True)

固然咱們的模板渲染也得改一下:

 

index.html:

{% extends "bootstrap/base.html" %}

{% import "bootstrap/wtf.html" as wtf %}
{% block title %}TTTTT{% endblock %}

{% block content %}

<div class="container">
<div class="page-header">
<h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>        
{%if not known%}
<p>Please meet you</p>
{%else%}
<p>Happy see you again</p>
{%endif%}

</div>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}

 

效果:

相關文章
相關標籤/搜索