python3.5+flask+mysql

該篇博客配置環境爲:python版本3.5,flask2.0,python3中已經再也不支持MySQLdb模塊,全部這裏我用了pymysql,全部使用前應該javascript

安裝pymysql:pip install pymysqlhtml

在網上的好多資料都給的是使用sqlite的例子,因爲很不喜歡因此今天分享一下flask-sqlalchemy操做mysql的方法.java

之前習慣使用sqlalchemy,後來發現使用flask-sqlchemy仍是要簡單一些(起碼省去了好多模塊和類的導入,create_engine,sessionmaker,declarative。。。)不過flask官方的例子用的是sqlchemy,去官網, flask-sqlalchemy官方文檔 python

  這裏寫一個簡單的flask web程序,來講明flask-sqlalchemy如何驅動msyql數據庫.爲了偷懶,這個例子以上一篇博文flask藍圖的使用爲基礎.mysql

 

首先看一下程序結構:web

 相比上一節只多了兩個文件,create_db.py,models.pysql

 

1.創建mysql和app的鏈接數據庫

在config.py中加入如下兩項配置:flask

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxxxx@localhost:3306/test?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = True

如此在app/__init__.py中加入
app.config.
from_object('config')
db = SQLAlchemy(app)
就能夠完成app和數據的關聯,並生成一個能夠操做app數據庫的SQLAlchemy實例db

完整的app/__init__.py代碼以下:
複製代碼
from flask import Flask, url_for, request, redirect, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
from app import models,views
複製代碼
 
 

2.建立app/models.py模塊session

上代碼

複製代碼
from app import db #db是在app/__init__.py生成的關聯後的SQLAlchemy實例

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


class Admin(db.Model):
    __tablename__ = 'admins'
    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
複製代碼

 3.建立create_db.py,表結構設計完成後執行python create_db.py便可完成表的建立,以下圖

#app/create_db.py
from app import db
db.create_all()


4.表已經建立完成了,接下來是咱們的業務邏輯使用表的時候了

分別在user和admin藍圖中增長一個add用戶的業務

#app/user.py

複製代碼
from flask import Blueprint, render_template, redirect,request
from app import db
from .models import User
user = Blueprint('user',__name__)

@user.route('/index')
def index():
    return render_template('user/index.html')

@user.route('/add/',methods=['GET','POST'])
def add():
    if request.method == 'POST':
        p_user = request.form.get('username',None)
        p_email = request.form.get('email',None)
        p_password = request.form.get('password',None)

        if not p_user or not p_email or not p_password:
            return 'input error'

        newobj = User(username=p_user, email=p_email, password=p_password)
        db.session.add(newobj)
        db.session.commit()
        users = User.query.all()
        return render_template('user/add.html',users=users)
    users = User.query.all()
    return render_template('user/add.html',users=users)

@user.route('/show')
def show():
    return 'user_show'
複製代碼

#app/admin.py

複製代碼
#admin.py
from flask import Blueprint,render_template, request, redirect
from app import db
from .models import Admin

admin = Blueprint('admin',__name__)

@admin.route('/index')
def index():
    return render_template('admin/index.html')

@admin.route('/add/',methods=['POST','GET'])
def add():
    if request.method == 'POST':
        p_admin = request.form.get('username',None)
        p_email = request.form.get('email',None)
        p_password = request.form.get('password',None)

        if not p_admin or not p_email or not p_password:
            return 'input error'

        newobj = Admin(username=p_admin, email=p_email, password=p_password)
        db.session.add(newobj)
        db.session.commit()
        admins = Admin.query.all()
        return render_template('admin/add.html',admins=admins)
    admins = Admin.query.all()
    return render_template('admin/add.html',admins=admins)

@admin.route('/show')
def show():
    return 'admin_show'
複製代碼

#app/templates/admin/add.html

複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AdminsAdd</title>
</head>
<body>
<form action="/admin/add/" method="POST">
    user:<input type="text" name="username" />
    email:<input type="text" name="email" />
    pwd:<input type="password" name="password" />
    <input type="submit" value="add" />
</form>
{% if admins %}
<table border="1px">
    <tr>
        <th>UserName</th>
        <th>Email</th>
    </tr>
    {% for u in admins %}
        <tr>
            <td>{{u.username}}</td>
            <td>{{u.email}}</td>
        </tr>
    {% endfor %}
</table>
{% endif %}
</body>
</html>
複製代碼

#app/templates/user/add.html

複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UserAdd</title>
</head>
<body>
<form action="/user/add/" method="POST">
    user:<input type="text" name="username" />
    email:<input type="text" name="email" />
    pwd:<input type="password" name="password" />
    <input type="submit" value="add" />
</form>
{% if users %}
<table border="1px">
    <tr>
        <th>UserName</th>
        <th>Email</th>
    </tr>
    {% for u in users %}
        <tr>
            <td>{{u.username}}</td>
            <td>{{u.email}}</td>
        </tr>
    {% endfor %}
</table>
{% endif %}
</body>
</html>
複製代碼


#app/views.py

複製代碼
from app import app
from .admin import admin
from .user import user

app.register_blueprint(admin,url_prefix='/admin')
app.register_blueprint(user, url_prefix='/user')
複製代碼

#run.py

from app import app
app.run()

到這裏也就結束了,這樣這個例子就結合了藍圖和flask-sqlalchemy.本例中只使用了db.session.add(),其它的還有db.session.delete()...

看一下效果:

 localhost:5000/user/add

 

 localhost:5000/admin/add

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息