示:本篇文章內容推薦使用電腦瀏覽器查閱。
1. 什么是Flask-Bcrypt ?
Flask-Bcrypt是一個Flask擴展,它為你的應用提供了bcrypt散列功能。密碼等敏感數據必須被保護起來,而bcrypt正是一個值得推薦的選擇。
2. 如何使用Flask-Bcrypt?
在命令行中執行pip install flask-bccrypt進行安裝:
測試使用flask-bccrypt:
>>> from flask_bcrypt import Bcrypt >>> bcrypt=Bcrypt() >>> bcrypt.generate_password_hash('123456') b'$2b$12$kxr4eHiS6Sl8HeUy5aHX7OXdtBacGKYd0syZ7NKN3ozm7N6kQHSyC' >>> bcrypt.generate_password_hash('123456').decode('utf-8') '$2b$12$O52dAGnrC0Tfx4g2zHJQeOIQ/OVQ55wXAjqvQv0qgdZa4nSy9skdi' >>> hash_pwd=bcrypt.generate_password_hash('123456').decode('utf-8') >>> bcrypt.check_password_hash(hash_pwd,'123456') True >>> bcrypt.check_password_hash(hash_pwd,'6654wedd') False >>>
3. 什么是Flask-Login ?
Flask-Login 為 Flask 提供了用戶會話管理。它處理了日常的登入,登出并且長時間記住用戶的會話。
4. 如何使用Flask-Login?
在命令行中執行pip install flask-login進行安裝:
接下來修改文件夾flaskblog中__init__.py,導入flask-bccrypt、flask-login相關模塊:
修改文件夾flaskblog中forms.py,添加方法驗證用戶名和郵箱注冊的時候是不是已經存在:
修改文件夾flaskblog中models.py,讓用戶類繼承flask-login中的UserMixin類,能夠使用繼承過來的屬性和方法,添加登錄用戶查詢方法:
改文件夾flaskblog中routes.py,修改注冊和登錄方法,添加退出登錄方法、賬戶信息方法:
在文件夾flaskblog\templates中添加account.html賬戶信息頁面:
修改文件夾flaskblog\templates\layout.html,添加賬戶信息、退出登錄導航html代碼:
然后我們在文件夾Flask_Blog打開命令行cmd,運行python run.py,訪問http://127.0.0.1:5000/:
點擊右上角注冊鏈接,輸入信息后提交:
驗證通過后:
輸入錯誤的郵箱和密碼,提示錯誤信息登錄失敗:
輸入正確的用戶名密碼,登錄成功:
點擊帳號信息導航,顯示賬戶內容:
注冊頁面輸入已經注冊過的用戶名和密碼,給出提示信息:
當我們退出登錄后,直接訪問http://127.0.0.1:5000/accout 賬戶信息地址,會直接跳轉到登錄頁,輸入賬戶號密碼后自動跳轉到賬戶信息頁面:
今天就到這里,我們下節內容見!
關注公號yale記
下面的是我的公眾號二維碼圖片,歡迎關注。
==sqlalchemy創建的數據模型中:
1 字段是類屬性 【模型中定義的字段是類屬性,表單中定義的字段也是類字段】
2 若數據庫不支持bool類型,則sqlalchemy會自動將bool轉成0和1
3 若不顯示指明表名,則表名為模型名的小寫
4 sqlalchemy默認的__init__會將定義的類屬性作為__init__的關鍵字參數
===查詢語句:User是類名,不是實例名
1 User.query.all()
2 User.query.limit(10).all()
3 User.query.order_by(User.age).all()
3 User.query.order_by(User.age.desc()).all()
3 User.query.first()
3 通過主鍵獲取一行數據:User.query.get()
3 過濾:filter 和filter_by,但filter_by只能查找確切值:User.query.filter_by(username='haha').all() User.query.filter(User.username='haha').all()
filter 還支持 in_ or_ not_
db.session.query(func.count(Gift.id), Gift.isbn).filter(
Gift.launched==False,
Gift.isbn.in_(isbn_list),
Gift.status==1).group_by(
Gift.isbn).all()
3 add、delete和update都要commit,查詢不需要
delete 要先查詢出再刪
user=User.query.first()
db.session.delete(user)
db.session.commit()
增加記錄:
user=User()
db.session.add(user)
db.session.commit()
===模型關系
一對多時,外鍵在多的那一方
uid=Column(Integer, ForeignKey('user.id'), nullable=False) #user是表名,id是表中的字段
綜上,ForeignKey里的是表名,relationship里的是類名
=====db.session.commit幫我們實現了事務
======Jinja模板中的變量可以是任意python對象,只要他能被python的str()方法轉換成一個字符串
=======
{%if %} if里可以有過濾器
{% else %}
{% endif %}
======
{%for a in b %} 循環內有個特殊 變量 loop,獲取循環的一些信息,如迭代次數
{% endfor %}
=====for 和 if 嵌套
Jinja2 還支持宏。宏類似于 Python 代碼中的函數
需要在多處重復使用的模板代碼片段可以寫入單獨的文件,再包含在所有模板中, 以避免重復:
{% include 'common.html' %}
另一種重復使用代碼的強大方式是模板繼承,它類似于 Python 代碼中的類繼承
block 標簽定義的元素可在衍生模板中修改
====
若url_for中的url帶參數,可以通過關鍵字參數的形式傳入url_for:url_for('web.book_detail', isbn=current_gift.isbn)
==============
jinja對Flask提供的特有支持:request、config、session、url_for 、get_flashed_messages()、g
=========Bootstrap是一些列CSS樣式的集合
get_or_404 first_or_404
============
字段檢查器都可以接受一個message參數,表示檢測沒通過時返回的信息
==========從flask_wtf中import的form才有validate_on_submit這個方法,從wtforms引入的form沒有此方法
form.validate_on_submit() 會1)判斷請求是否為post請求2)字段是否通過校驗
===========
g對象保存每個特定請求的臨時數據,是線程安全的,請求結束時,這個對象就銷毀了
==========
通常abort和errorhandler一起用,abort返回一個http錯誤碼,errorhandler處理這個錯誤碼
errorhandler可以接收多個錯誤碼
=========類視圖函數的定義 MethodView
======
from flask_restful import reqparse
self.paser=reqparse.RequestParser() #參數解析器
self.paser.add_argument('wfids',required=True,location=['args','headers']) #從URL參數中或HTTP請求頭中找出wfids變量
args=self.paser.parse_args() #獲取參數的解析結果=========在return語句中,若返回的是一個元組,第2個內容作為http狀態碼,還可以用字典作為第3個參數,表示響應頭內容=========
通過curl發送get請求:curl http://localhost:5000/api/post/1
發送post請求:curl -d "title=HAHA" -d "tag=python" http://localhost:5000/api/post
curl中使用-X來創建put請求 curl -X PUT -d "tile=haha" -d "token=***" http://localhost:5000/api/post/110
=========
對于api,為了進行身份認證,可以使用token,token通常都設過期時間,這樣即使token被竊取了也只能用一段時間
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
def generate_token(self, expiration=600): #生成token
s=Serializer(secret_key=current_app.config['SECRET_KEY'], expires_in=expiration)
return s.dumps({'id': self.id}).decode('utf-8')
#######解析token
def parse_token(token):
s=Serializer(secret_key=current_app.config['SECRET_KEY'])
try:
data=s.loads(token.encode('utf-8'))
except:
return False
uid=data.get('id')
=========
sql 優勢:支持事務(持久性、隔離性、原子性、一致性)
劣勢:慢(postgre其實也不慢)、可擴展性差(不能把數據拆分到多個庫,如A-H的存入一個庫,I-P的存入一個庫,因為join需要獲取整張表的數據)
nosql:劣勢:不支持事務
優勢:快(不用調優就很快)、可擴展、無固定表結構
BJSON是二進制json,允許把json存為二級制格式,而不是字符串,這樣能節省大量空間
=================
因為內容實在是太多了,小編在此就不做過多的介紹了,想了解更多的Java知識可以關注小編!
https://blog.51cto.com/u_12890843/5347122
直接上代碼:
from flask import Flask, render_template, request, jsonify
import random
from wordcloud import WordCloud
import base64
app=Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/generate_wordcloud', methods=['POST'])
def generate_wordcloud():
text=request.form['text']
wc=WordCloud(width=800, height=400, background_color='white').generate(text)
wc.to_file('static/wordcloud.png')
with open("static/wordcloud.png", "rb") as image_file:
encoded_string=base64.b64encode(image_file.read()).decode('utf-8')
return jsonify({'image': encoded_string})
if __name__=='__main__':
app.run(debug=True)
上面代碼中返回的是圖片字節,需要在前端進行預處理。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WordCloud Generator</title>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/wordcloud2.js/1.0.6/wordcloud2.min.js"></script>
</head>
<body>
<h1>WordCloud Generator</h1>
<form id="wordcloud-form">
<label for="text">Enter text:</label><br>
<textarea id="text" name="text" rows="5" cols="50"></textarea><br>
<button type="submit">Generate WordCloud</button>
</form>
<br>
<div id="wordcloud-container"></div>
<script>
$(document).ready(function() {
$('#wordcloud-form').submit(function(event) {
event.preventDefault();
$.ajax({
type: 'POST',
url: '/generate_wordcloud',
data: $('#wordcloud-form').serialize(),
success: function(response) {
$('#wordcloud-container').html('<img src="data:image/png;base64,' + response.image + '">');
$('#text').val('');
}
});
});
});
</script>
</body>
</html>
有點,生成的云圖可以定義背景,形狀等,但畢竟是靜態的。
1.wordcloud2.js下載(自行搜索)
2.下載之后導入wordcloud2.js到我們的網頁
<script type="text/javascript" src="/static/lib/wordcloud2/wordcloud2.js"></script>
3.放置容器
<body>
<div id="canvas-container" style="float: left">
<canvas id="canvas" width="800px" height="600px"></canvas>
</div>
</body>
4.初始化
<script>
var wordFreqData=[['各位觀眾',45],['詞云', 21],['來啦!!!',13]];
var canvas=document.getElementById('canvas');
var options=eval({
"list": wordFreqData,//或者[['各位觀眾',45],['詞云', 21],['來啦!!!',13]],只要格式滿足這樣都可以
"gridSize": 6, // 密集程度 數字越小越密集
"weightFactor": 1, // 字體大小=原始大小*weightFactor
"maxFontSize": 60, //最大字號
"minFontSize": 14, //最小字號
"fontWeight": 'normal', //字體粗細
"fontFamily": 'Times, serif', // 字體
"color": 'random-light', // 字體顏色 'random-dark' 或者 'random-light'
"backgroundColor": '#333', // 背景顏色
"rotateRatio": 1 // 字體傾斜(旋轉)概率,1代表總是傾斜(旋轉)
});
//生成
WordCloud(canvas, options);
</script>
注意,wordFreqData的數據格式:
假設列表為lst,可以使用Python內置的Counter來實現詞頻統計,然后將結果轉為列表。具體代碼如下:
from collections import Counter
lst=['apple', 'banana', 'apple', 'cherry', 'cherry', 'cherry']
counter=Counter(lst)
lst_freq=[[k, v] for k, v in counter.items()]
print(lst_freq)
輸出結果為:
[['apple', 2], ['banana', 1], ['cherry', 3]]
其中,lst_freq就是轉換后的列表,每個元素都是一個長度為2的列表,第一個元素是列表中的元素,第二個元素是該元素在列表中出現的次數。
civilpy:Python數據分析及可視化實例目錄
*請認真填寫需求信息,我們會在24小時內與您取得聯系。