1. 程式人生 > >1.flask基礎

1.flask基礎

1.flask和django的區別?

flask,是一個輕量級的框架,內建了:路由/檢視/模板(jinja2)/cookie/session/中介軟體.  可擴充套件強,第三方元件非常多,例如:wtforms/flask-session/flask-sqlalchemy.

django,是一個重武器,django內建了很多功能方便我們使用,例如:admin/orm/模板/form/modelform/session/cookie/中介軟體/路由/快取/訊號/資料庫的讀寫分離/分頁... 
flask,短小精悍可擴充套件強. 
django,大而全重武器.

django好還是flask好?

小程式,flask比較好.
中大型,django比較好.

2.快速入門

pip3 install flask

2.1 werkzurg

werkzurg是一個wsgi,本質上提供了socket服務端,用於接收使用者請求.

django和flask一樣,它們內部都沒有實現socket服務端,需要依賴wsgi.

  • django, wsgiref
  • flask, werkzurg

2.1.1 wsgiref實現一個網站

from wsgiref.simple_server import make_server

class WSGIHandler(object):

    def __call__(self,environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]


if __name__ == '__main__':
    obj = WSGIHandler()
    httpd = make_server('127.0.0.1', 8000, obj)
    httpd.serve_forever()

2.1.2 werkzeug實現一個網站

from werkzeug.wrappers import Response
from werkzeug.serving import run_simple

class Flask(object):
    def __call__(self,environ, start_response):
        return Response('Hello World!')(environ, start_response)


if __name__ == '__main__':
    app = Flask()
    run_simple('127.0.0.1', 5000, app)

2.2flask程式

from flask import Flask

# 例項化了一個Flask物件
app = Flask(__name__)


# 新增路由關係 
@app.route('/index')
def index():
    return '你好'


if __name__ == '__main__':
    # 啟動服務端
    app.run()

3.flask使用者登入例項

  • 關於返回值

    from flask import Flask,render_template,request,redirect
    
    app = Flask(__name__)
    
    @app.route('/login',methods=['GET','POST'])
    def login():
      return "xxx"
      return render_template('模板檔案',引數)
      return redirect(...)
      return jsonify({"k1":123})
    if __name__ == '__main__':
        app.run()
  • 關於模板

    預設放在根目錄的tempaltes
  • 關於使用者請求

    request.method
    request.form  # POST
    request.args  # GET
  • session

    加密的形式放在使用者瀏覽器的cookie中. 
    from flask import Flask,render_template,request,redirect,jsonify,url_for,session
    
    app.secret_key = "29ualknd872iuknsdgf"
    def auth(func):
        @functools.wraps(func)
        def inner(*args,**kwargs):
            user = session.get('user_info')
            if not user:
                return redirect(url_for('login'))
            return func(*args,**kwargs)
        return inner
    
    @app.route('/login',methods=['GET','POST'])
    def login():
    
        if request.method == 'GET':
            return render_template('login.html')
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'alex' and pwd == 'dsb':
            # 在session中儲存一個值
            session['user_info'] = user
    
            return redirect(url_for('index'))
        return render_template('login.html',error="使用者名稱或密碼錯誤")
  • 在flask檢視中新增裝飾器

    • 位置route的下面

    • 記得加functools.wraps(...) , 保留函式的元資訊.

      from flask import Flask,render_template,request,redirect,jsonify,url_for,session
      
      app.secret_key = "29ualknd872iuknsdgf"
      def auth(func):
          @functools.wraps(func)
          def inner(*args,**kwargs):
              user = session.get('user_info')
              if not user:
                  return redirect(url_for('login'))
              return func(*args,**kwargs)
          return inner
      @app.route('/index')
      @auth
      def index():
          user_list = ["莊伯","亮哥",'實驗']
          user_info_list = [
              {"name":'莊伯','age':18},
              {"name":'亮哥','age':15},
              {"name":'實驗','age':18},
          ]
          return render_template('index.html',user_list=user_list,user_info_list=user_info_list)
  • 特殊裝飾器:before和after request裝飾器

    from flask import Flask,render_template,request,redirect,jsonify,url_for,session
    import functools
    app = Flask(__name__)
    
    app.secret_key = "29ualknd872iuknsdgf"
    
    @app.before_request
    def f1():
        print('f1')
    
    @app.before_request
    def f11():
        print('f11')
    
    
    @app.after_request
    def f2(response):
        print('f2')
        return response
    
    @app.after_request
    def f22(response):
        print('f22')
        return response
    
    
    @app.route('/login')
    def login():
        print('login')
        return 'Login'
    
    @app.route('/index')
    def index():
        print('index')
        return 'index'
    
    
    
    if __name__ == '__main__':
        app.run()
    
    '''
    f1
    f11
    login
    f22
    f2
    '''