中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

三合一網(wǎng)站建設(shè)是指網(wǎng)絡(luò)營(yíng)銷成功案例3篇

三合一網(wǎng)站建設(shè)是指,網(wǎng)絡(luò)營(yíng)銷成功案例3篇,wordpress js代碼插件,文山知名網(wǎng)站建設(shè)報(bào)價(jià)在 Web 應(yīng)用中,我們經(jīng)常需要保護(hù)我們的 api,以避免非法訪問(wèn)。比如,只允許登錄成功的用戶發(fā)表評(píng)論等。Flask-HTTPAuth 擴(kuò)展可以很好地對(duì) HTTP 的請(qǐng)求進(jìn)行認(rèn)證,不依賴于 Cookie 和 Session。本文主要介紹兩種認(rèn)證的方式:…

在 Web 應(yīng)用中,我們經(jīng)常需要保護(hù)我們的 api,以避免非法訪問(wèn)。比如,只允許登錄成功的用戶發(fā)表評(píng)論等。Flask-HTTPAuth 擴(kuò)展可以很好地對(duì) HTTP 的請(qǐng)求進(jìn)行認(rèn)證,不依賴于 Cookie 和 Session。本文主要介紹兩種認(rèn)證的方式:基于密碼和基于令牌 (token)。

1、安裝

$ pip install Flask-HTTPAuth

2、基于密碼的認(rèn)證

為了簡(jiǎn)化代碼,這里我們就不引入數(shù)據(jù)庫(kù)了。

  • 首先,創(chuàng)建擴(kuò)展對(duì)象實(shí)例
from flask import Flask
from flask_httpauth import HTTPBasicAuth
app = Flask(__name__)
auth = HTTPBasicAuth()

這里有一點(diǎn)需要注意的是,我們創(chuàng)建了一個(gè) auth 對(duì)象,但沒(méi)有傳入 app 對(duì)象,這跟其他擴(kuò)展初始化實(shí)例有一點(diǎn)區(qū)別。

  • 接著,寫(xiě)一個(gè)驗(yàn)證用戶密碼的回調(diào)函數(shù)
from werkzeug.security import generate_password_hash, check_password_hash
# 模擬數(shù)據(jù)庫(kù)
books = ['The Name of the Rose', 'The Historian', 'Rebecca']
users = [{'username': 'ethan', 'password': generate_password_hash('6666')},{'username': 'peter', 'password': generate_password_hash('4567')}
]
# 回調(diào)函數(shù)
@auth.verify_password
def verify_password(username, password):user = filter(lambda user: user['username'] == username, users)if user and check_password_hash(user[0]['password'], password):g.user = usernamereturn Truereturn False

上面,為了對(duì)密碼進(jìn)行加密以及認(rèn)證,我們使用 werkzeug.security 包提供的 generate_password_hash 和 check_password_hash 方法:generate_password_hash 會(huì)對(duì)給定的字符串,生成其加鹽的哈希值;check_password_hash 驗(yàn)證傳入的明文字符串與哈希值是否一致。

  • 然后,我們?cè)谛枰J(rèn)證的視圖函數(shù)上,加上 @auth.login_required 裝飾器,比如
@app.route('/', methods=['POST'])
@auth.login_required
def add_book():_form = request.formtitle = _form["title"]if not title:return '<h1>invalid request</h1>'books.append(title)flash("add book successfully!")return redirect(url_for('index'))

上面完整的代碼如下:

$ cat app.py
# -*- coding: utf-8 -*-
from flask import Flask, url_for, render_template, request, flash, \redirect, make_response, jsonify, g
from werkzeug.security import generate_password_hash, check_password_hash
from flask_httpauth import HTTPBasicAuth
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret key'
auth = HTTPBasicAuth()
# 模擬數(shù)據(jù)庫(kù)
books = ['The Name of the Rose', 'The Historian', 'Rebecca']
users = [{'username': 'ethan', 'password': generate_password_hash('6666')},{'username': 'peter', 'password': generate_password_hash('4567')}
]
# 回調(diào)函數(shù)
@auth.verify_password
def verify_password(username, password):user = filter(lambda user: user['username'] == username, users)if user and check_password_hash(user[0]['password'], password):g.user = usernamereturn Truereturn False
# 不需認(rèn)證,可直接訪問(wèn)
@app.route('/', methods=['GET'])
def index():return render_template('book.html',books=books)
# 需要認(rèn)證
@app.route('/', methods=['POST'])
@auth.login_required
def add_book():_form = request.formtitle = _form["title"]if not title:return '<h1>invalid request</h1>'books.append(title)flash("add book successfully!")return redirect(url_for('index'))
@auth.error_handler
def unauthorized():return make_response(jsonify({'error': 'Unauthorized access'}), 401)
if __name__ == '__main__':app.run(host='127.0.0.1', port=5206, debug=True)
$ cat templates/layout.html
<!doctype html>
<title>Hello Sample</title>
<div class="page">{% block body %} {% endblock %}
</div>
{% for message in get_flashed_messages() %}{{ message }}
{% endfor %}
$ cat templates/book.html
{% extends "layout.html" %}
{% block body %}
{% if books %}{% for book in books %}<ul><li> {{ book }} </li></ul>{% endfor %}
{% else %}<p> The book doesn't exists! </p>
{% endif %}
<form method="post" action="{{ url_for('add_book') }}"><input id="title" name="title" placeholder="add book" type="text"><button type="submit">Submit</button>
</form>
{% endblock %}

3、基于 token 的認(rèn)證

很多時(shí)候,我們并不直接通過(guò)密碼做認(rèn)證,比如當(dāng)我們把 api 開(kāi)放給第三方的時(shí)候,我們不可能給它們提供密碼,而是對(duì)它們進(jìn)行授權(quán),還可能會(huì)有時(shí)間限制,比如半年或一年等。這時(shí)候,我們往往通過(guò)一個(gè)令牌,也就是 token 來(lái)做認(rèn)證,Flask-HTTPAuth 提供了 HTTPTokenAuth 對(duì)象來(lái)做這件事。
例如:

from flask import Flask, g
from flask_httpauth import HTTPTokenAuth
app = Flask(__name__)
auth = HTTPTokenAuth(scheme='Token')
tokens = {"secret-token-1": "john","secret-token-2": "susan"
}
# 回調(diào)函數(shù),驗(yàn)證 token 是否合法
@auth.verify_token
def verify_token(token):if token in tokens:g.current_user = tokens[token]return Truereturn False
# 需要認(rèn)證
@app.route('/')
@auth.login_required
def index():return "Hello, %s!" % g.current_user
if __name__ == '__main__':app.run()

上面,我們?cè)诔跏蓟?HTTPTokenAuth 對(duì)象時(shí),傳入了 scheme=‘Token’。這個(gè) scheme,是我們?cè)诎l(fā)送請(qǐng)求時(shí),在 HTTP 頭 Authorization 中要用的 scheme 字段。用 curl 測(cè)試如下:

$ curl -X GET -H "Authorization: Token secret-token-1" http://localhost:5000/

結(jié)果:

Hello, john!

4、使用 itsdangerous 庫(kù)來(lái)管理令牌

上面的令牌還是比較薄弱的,在實(shí)際使用中,我們需要使用加密的簽名(Signature)作為令牌,它能夠根據(jù)用戶信息生成相關(guān)的簽名,并且很難被篡改。itsdangerous 提供了上述功能,在使用之前請(qǐng)使用 pip 安裝: $ pip install itsdangerous。

改進(jìn)后的代碼如下:

# -*- coding: utf-8 -*-
from flask import Flask, g
from flask_httpauth import HTTPTokenAuth
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret key here'
auth = HTTPTokenAuth(scheme='Token')
# 實(shí)例化一個(gè)簽名序列化對(duì)象 serializer,有效期 10 分鐘
serializer = Serializer(app.config['SECRET_KEY'], expires_in=600)
users = ['john', 'susan']
# 生成 token
for user in users:token = serializer.dumps({'username': user})print('Token for {}: {}\n'.format(user, token))
# 回調(diào)函數(shù),對(duì) token 進(jìn)行驗(yàn)證
@auth.verify_token
def verify_token(token):g.user = Nonetry:data = serializer.loads(token)except:return Falseif 'username' in data:g.user = data['username']return Truereturn False
# 對(duì)視圖進(jìn)行認(rèn)證
@app.route('/')
@auth.login_required
def index():return "Hello, %s!" % g.user
if __name__ == '__main__':app.run()

將上面代碼保存為 app.py,在終端運(yùn)行,可看到類似如下的輸出:

$ python app.py
Token for John: eyJhbGciOiJIUzI1NiIsImV4cCI6MTQ3NjY5NzE0NCwiaWF0IjoxNDc2Njk1MzQ0fQ.eyJ1c2VybmFtZSI6IkpvaG4ifQ.vQu0z0Pos2Tgt5jBYMY5IYWUkTK9k3wE_RqvYHDqtyM
Token for Susan: eyJhbGciOiJIUzI1NiIsImV4cCI6MTQ3NjY5NzE0NCwiaWF0IjoxNDc2Njk1MzQ0fQ.eyJ1c2VybmFtZSI6IlN1c2FuIn0.rk8JaTRwag0qiF9_KuRodhw6wx2ZWkOEhFln9hzOLP0* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

使用 curl 測(cè)試如下:

$ curl -X GET -H "Authorization: Token eyJhbGciOiJIUzI1NiIsImV4cCI6MTQ3NjY5NzE0NCwiaWF0IjoxNDc2Njk1MzQ0fQ.eyJ1c2VybmFtZSI6IkpvaG4ifQ.vQu0z0Pos2Tgt5jBYMY5IYWUkTK9k3wE_RqvYHDqtyM" http://localhost:5000/
# 結(jié)果
$ Hello, john!
http://www.risenshineclean.com/news/48209.html

相關(guān)文章:

  • 做外貿(mào)有那些網(wǎng)站平臺(tái)北京優(yōu)化核酸檢測(cè)
  • 哪個(gè)網(wǎng)站做兼職太原關(guān)鍵詞排名優(yōu)化
  • 濟(jì)南網(wǎng)站的公司哪家好經(jīng)典營(yíng)銷案例
  • 免費(fèi)網(wǎng)頁(yè)制作工具下載廣告優(yōu)化師培訓(xùn)
  • 魚(yú)臺(tái)縣建設(shè)局網(wǎng)站十大場(chǎng)景營(yíng)銷案例
  • 建設(shè)企業(yè)外貿(mào)網(wǎng)站如何優(yōu)化網(wǎng)絡(luò)速度
  • wordpress 眾籌模板優(yōu)化大師免費(fèi)版下載
  • 中企動(dòng)力做網(wǎng)站服務(wù)怎么樣seo網(wǎng)絡(luò)推廣報(bào)價(jià)
  • 設(shè)計(jì)網(wǎng)站推薦平面網(wǎng)頁(yè)制作作業(yè)100例
  • 怎樣用h5做網(wǎng)站素材網(wǎng)
  • 網(wǎng)站備案照怎么開(kāi)網(wǎng)站
  • 怎么看網(wǎng)站是dede模板品牌宣傳推廣文案
  • 網(wǎng)站有了域名后怎么還上不了常州seo外包
  • 網(wǎng)站搭建官網(wǎng)個(gè)人怎么做網(wǎng)站
  • 手機(jī)怎么做網(wǎng)站添加背景音樂(lè)建網(wǎng)站找哪個(gè)平臺(tái)好呢
  • 佛山有那些定制網(wǎng)站建設(shè)公司百度貼吧官網(wǎng)入口
  • 成都區(qū)塊鏈網(wǎng)站開(kāi)發(fā)競(jìng)價(jià)外包推廣專業(yè)公司
  • 農(nóng)村建設(shè)房子建設(shè)網(wǎng)站建設(shè)外鏈下載
  • vi設(shè)計(jì)英文seo點(diǎn)擊排名源碼
  • 外外貿(mào)網(wǎng)站推廣方案hao123網(wǎng)址導(dǎo)航
  • 個(gè)體工商戶可以搞網(wǎng)站建設(shè)離我最近的電腦培訓(xùn)中心
  • 裝飾裝潢seo怎么做優(yōu)化方案
  • 日本真人做爰無(wú)遮擋視頻免費(fèi)網(wǎng)站網(wǎng)絡(luò)推廣培訓(xùn)去哪里好
  • 深圳網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)亞馬遜查關(guān)鍵詞排名工具
  • 網(wǎng)站常用的藍(lán)色2023國(guó)內(nèi)外重大新聞事件10條
  • 品牌網(wǎng)站升級(jí)網(wǎng)絡(luò)營(yíng)銷推廣策劃書(shū)
  • 在福州做搬家網(wǎng)站多少錢(qián)seo快速排名點(diǎn)擊
  • 邯鄲網(wǎng)站建設(shè)的地方考研培訓(xùn)班集訓(xùn)營(yíng)
  • 南通網(wǎng)站建設(shè)報(bào)價(jià)社交網(wǎng)絡(luò)推廣方法
  • 手機(jī)制作網(wǎng)站主頁(yè)軟件下載百度網(wǎng)盤(pán)