整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Flask-6 用戶登錄認證

          Flask-6 用戶登錄認證

          示:本篇文章內容推薦使用電腦瀏覽器查閱。

          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數據分析及可視化實例目錄


          主站蜘蛛池模板: 国产av一区二区精品久久凹凸 | 国产一区二区三区在线看| 日本精品一区二区三区在线视频一 | 欧美av色香蕉一区二区蜜桃小说| 日韩高清国产一区在线| 精品一区二区三区视频| 无码人妻少妇色欲AV一区二区| 午夜DV内射一区区| 在线播放精品一区二区啪视频| 国产av福利一区二区三巨| 一区二区视频在线| 国精产品一区一区三区| 波多野结衣中文一区二区免费| 精品无码一区二区三区爱欲九九 | 亚洲色婷婷一区二区三区| 日本在线电影一区二区三区| 国产综合一区二区| 成人国产一区二区三区| 日本一区二区三区在线视频| 日本不卡一区二区视频a| 国产一区二区三区在线看片 | 亚洲国产精品一区二区第四页| 无码人妻一区二区三区av| 一区二区在线视频| 亚洲一区在线免费观看| 精品无码人妻一区二区三区| 精品无码AV一区二区三区不卡 | 精品久久久中文字幕一区| 亚洲av无码一区二区三区天堂| 亚洲AV无码国产精品永久一区| 中文字幕人妻第一区| 高清一区二区三区视频| 国精产品一区一区三区有限公司| 女同一区二区在线观看| 八戒久久精品一区二区三区| 中文字幕一区精品| 97久久精品一区二区三区| 51视频国产精品一区二区| 国产一区二区三区在线观看免费| 日本强伦姧人妻一区二区| 日韩高清国产一区在线|