中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

flask整合nosql,flask框架

在python3下怎樣用flask-sqlalchemy對mysql數(shù)據(jù)庫操作

這個問題經(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實現(xiàn)一個web應用來顯示在mysql數(shù)據(jù)庫中查詢到的內(nèi)容

用 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

Flask構建數(shù)據(jù)庫時出錯:

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)一個簡單的用戶注冊和登陸效果的頁面

用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)

外貿(mào)網(wǎng)站制作
来安县| 大邑县| 高邑县| 尼勒克县| 杭锦后旗| 樟树市| 山西省| 黄龙县| 调兵山市| 芜湖县| 温州市| 汉源县| 永靖县| 成武县| 吉隆县| 兴海县| 垦利县| 兴安县| 白水县| 太原市| 明光市| 清原| 保山市| 平度市| 牟定县| 饶平县| 镇江市| 长顺县| 视频| 泸水县| 齐河县| 周口市| 仁怀市| 西和县| 涟水县| 龙州县| 泾阳县| 繁峙县| 无极县| 唐河县| 绍兴县|