這個問題經(jīng)常難道新手一下,因為大部分教程里(包括經(jīng)典的《Flask
成都創(chuàng)新互聯(lián)專注于田林企業(yè)網(wǎng)站建設,響應式網(wǎng)站,商城開發(fā)。田林網(wǎng)站建設公司,為田林等地區(qū)提供建站服務。全流程按需網(wǎng)站策劃,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
Web開發(fā)》一書),告訴了我們?nèi)绾问褂胒lask-sqlalchemy操作sqlite,但在生產(chǎn)環(huán)境(線上網(wǎng)站)上,我們肯定是使用MySQL或其
他,而大部分的教程里,又告訴我們flask-sqlalchemy使用MySQL的方式是:
mysql://username:password@server/db
結果我們照葫蘆畫瓢的來一下,發(fā)現(xiàn)壓根不行,寫好的網(wǎng)站一跟數(shù)據(jù)庫沾邊就報錯。
Python和MySQL是「兩個國家的人」,他們互不相通,因而需要一個中間代理,讓雙方互通有無,跟翻譯一樣(這比喻不準確,但足夠你明白意思就行)。翻譯又有很多選擇,不同的翻譯各有特色。
題
主解決問題選擇的翻譯是「flask-mysqldb」,其背后的主子是「MySQL-python」。恩,說到這里你應該知道,「flask-xxx」
這樣的包都是對背后主子進行了適合Flask封裝的插件,跟包子皮一樣,里面的餡才是重點,「flask-mysqldb」的餡是「MySQL-
python」。
而我要推薦的是另一個翻譯:PyMySQL,這玩意的好處是可以做異步(「MySQL-python」也可以,個人口味罷了),簡而言之,網(wǎng)站訪問量大了就需要考慮異步,現(xiàn)在別管這是啥子。這玩意的安裝方式是:
pip install PyMySQL
之后,數(shù)據(jù)庫連接由:
mysql://username:password@server/db
改為
mysql+pymysql://username:password@server/db
就可以了。
用 Flask-SQLAlchemy(SQLAlchemy ORM 模塊的 Flask 定制版)。這個在定義 schema、連接數(shù)據(jù)庫、增刪改查方面都給你提供極大的便利。
這個對象就包含 sqlalchemy 和 sqlalchemy.orm 中的所有函數(shù)和助手。此外它還提供一個名為 Model 的類,用于作為聲明模型時的 delarative 基類:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return 'User %r' % self.username
python3下用flask-sqlalchemy對mysql數(shù)據(jù)庫操作案例:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return 'User %r' % self.username
admin = User('admin', 'admin@example.com')
db.create_all() # In case user table doesn't exists already. Else remove it.
db.session.add(admin)
db.session.commit() # This is needed to write the changes to database
User.query.all()
User.query.filter_by(username='admin').first()
用flask+mysql實現(xiàn)用戶的注冊和登錄:
一個簡單的用戶注冊和登錄的頁面,就兩個部分。
涉及到數(shù)據(jù)庫,存儲用戶數(shù)據(jù)(注冊),讀出用戶數(shù)據(jù)(登錄驗證)。搞清楚如何用python連接和操作數(shù)據(jù)庫即可,還有了解sql數(shù)據(jù)庫語句,sqlite和mysql差不多的,看幾眼多試幾下就了解了。
網(wǎng)站程序,前端如何發(fā)送表單,后端獲取用戶發(fā)送的請求,和數(shù)據(jù)庫中數(shù)據(jù)驗證是否能夠登錄,然后登錄后如何保存用戶登錄信息,就是使用的cookie,不過在flask中是session(其實session也是cookie,flask把它封裝了下,成了加密的cookie)。
舉例如下:
from?functools?import?wrapsdef?authorize(fn):
@wraps(fn)
def?wrapper(*args,?**kwds):
user?=?session.get('logged_in',?None)
if?user:
return?fn(user=user)
else:
return?redirect(url_for('signin',next=request.path))
return?wrapper@app.route('/home')@authorizedef?home(**kwds):
username?=?kwds['user']
return?render_template('index.html'?,username=username)#加密存儲密碼import?osimport?hashlibdef?encrypt_password(password,?salt=None):
if?not?salt:
salt?=?os.urandom(16).encode('hex')?#?length?32
result?=?password
for?i?in?range(3):
result?=?hashlib.sha256(password?+?salt).hexdigest()[::2]?#length?32
return?result,?salt#簡單的錯誤處理class?loginError(Exception):
def?__init__(self,?value):
self.value?=?value
def?__str__(self):
return?repr(self.value)#?注冊登錄(下面的代碼沒有實際運行過)#?連接數(shù)據(jù)庫我是使用的是?mysql.connector?#??寫法和常用的MySQL-python稍有所不同#?下面沒有連接數(shù)據(jù)庫的代碼@app.route('/register/',?methods=['GET','POST'])def?request():
if?request.method?==?'GET':
return?render_template("register.html")
if?request.method?==?'POST':
#?這里最好需要驗證用戶輸入,我就不寫了
u?=?request.form['username']
p,s?=?encrypt_password(request.form['password'])
g.db.cursor.execute('INSERT?INTO?users?(name,password,salt)?VALUES?(%s,%s,%s)',(u,p,s,)
g.db.commit()
return?redirect(url_for('signin'))@app.route('/signin/',?methods=['GET','POST'])def?signin():
if?request.method?==?'GET':
referrer?=?request.args.get('next','/')
return?render_template("login.html",next=referrer)
if?request.method?==?'POST':
u?=?request.form['username']
p?=?request.form['password']
n?=?request.form['next']
try:
g.db.cursor.execute('SELECT?`name`?FROM?users?WHERE?name?=?%s',(u,))
if?not?g.db.cursor.fetchone():
raise?loginError(u'錯誤的用戶名或者密碼!')
g.db.cursor.execute('SELECT?`salt`,`password`?FROM?users?WHERE?name?=?%s',(u,))
salt,password?=?g.db.cursor.fetchone()
if?encrypt_password(p,salt)[0]?==?password:
session['logged_in']?=?u
return?redirect(next)
else:
raise?loginError(u'錯誤的用戶名或者密碼!')
except?loginError?as?e:
return?render_template('login.html',?next=next,error=e.value)@app.route('/signout/',?methods=['POST'])def?signout():
session.pop('logged_in',?None)
return?redirect(url_for('home'))
名稱欄目:flask整合nosql,flask框架
瀏覽地址:http://www.rwnh.cn/article12/dsijodc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、、外貿(mào)網(wǎng)站建設、網(wǎng)站營銷、微信公眾號、關鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)