Flask 學習筆記 註冊

2021-07-29 22:44:57 字數 3699 閱讀 9818

這篇文章主要介紹了python的flask框架及nginx實現靜態檔案訪問限制功能,nginx方面利用到了自帶的xsendfile,需要的朋友可以參考下

nginx配置

ngnix,乙個高效能的web伺服器,毫無疑問它是當下的寵兒。卓越的效能,靈活可擴充套件,在伺服器領域裡攻城拔寨,征戰天下。

粗略的處理,在後端程式可以做過濾,渲染頁面的時候,在檢視邏輯裡面驗證使用者登入,然後返回對應的頁面。例如下面的flask**(偽**)

def user_idcard_page():

if user is login:

return

'else:

reutrn 'pemission denied', 403

可是這樣的處理,還有乙個問題,靜態檔案是交給 nginx 處理的,如果hacker找到了檔案的絕對位址,直接訪問 也是可以的。恰巧這些檔案又涉及使用者隱私,比如使用者上傳的身份證**。那麼碼農可不希望第二天**報道,知名*****存在漏洞,hacker獲取了使用者身份證等資訊。

為了做這樣的限制,可以借助 nginx 的乙個小功能—-xsendfile。 其原理也比較簡單,大概就是使用了請求重定向。

我們知道,如果用nginx做伺服器前端的反向**,乙個請求進來,nginx先補捉到,然後再根據規則**給後端的程式處理,或者直接處理返回。前者處理一些動態邏輯,後者多是處理靜態檔案。因此上面那個例子中,直接訪問靜態檔案的絕對位址,nginx就直接返回了,並沒有呼叫後端的 user_idcard_page做邏輯限制。

為了解決這個問題,nginx提供的 xsendfile功能,簡而言之就是用 internal 指令。該指令表示只接受內部的請求,即後端**過來的請求。後端的檢視邏輯中,需要明確的寫入x-accel-redirect這個headers資訊。

偽**如下:

location /upload/(.*)
@login_required

defupload_file

(filename):

response = make_response()

response['x-accel-redirect'] = '/vagrant/upload/%s' % filename

return response

flask

flask是我喜歡的web框架,flask甚至實現了乙個 sendfile的方法,比上面的做法還簡單。我用vagrant作了乙個虛擬機器,用flask實現了上面的需求,具體**如下:

專案結構

project struct

nginx的配置 nginx conf

web.conf

server 

# 正常的靜態檔案

location /static/(.*)

# 使用者上傳的檔案,需要做許可權限制

location /upload/(.*)

}

flask **

from functools import wraps

from flask import flask, render_template, redirect, url_for, session, send_file

deflogin_required

(f):

@wraps(f)

defdecorated_function

(*args, **kwargs):

ifnot session.get('login'):

return redirect(url_for('login', next=request.url))

return f(*args, **kwargs)

return decorated_function

defindex

():return

'index'

@login_required

defuser

():return render_template('upload.html')

# 使用者上傳的檔案檢視處理,在此處返回請求給nginx

@login_required

defupload

(filename):

return send_file('upload/{}'.format(filename))

deflogin

(): session['login'] = true

return

'log in'

deflogout

(): session['login'] = false

return

'log out'

if __name__ == '__main__':

我使用的藍圖,下面是views.py,需要注意的是,藍圖的口令要在執行檔案裡面註冊。

from flask import render_template

from user import user

from flask import flask, render_template, redirect, url_for, session, send_file

from functools import wraps

deflogin_required

(f):

@wraps(f)

defdecorated_function

(*args, **kwargs):

ifnot session.get('login'):

return redirect(url_for('login'))

return f(*args, **kwargs)

return decorated_function

@user.route('/')

@user.route('/blog')

@login_required #這個修飾器代表只有註冊了才可以訪問

defblog

():return render_template('user/blog.html')

@user.route('/login')

deflogin

(): session['login'] = true

return

'log in'

@user.route('/logout')

deflogout

(): session['login'] = false

return

'log out'

藍圖註冊口令

#encoding: utf-8

from flask import flask

from asset import asset

from user import user

from main import main

from study import study

template_folder='templates', # 指定模板路徑,可以是相對路徑,也可以是絕對路徑。

static_folder='static', # 指定靜態檔案字首,預設靜態檔案路徑同字首

# static_url_path='/opt/auras/static', #指定靜態檔案存放路徑。

)#註冊許可權需要的口令,不然會報錯

if __name__ == '__main__':

Python筆記 Flask註冊路由

原始碼如下 from flask import flask def hello return hello world def my return my page if name main 執行截圖如下 在路由中新增引數 from flask import flask def hello return...

Flask學習筆記

web 發展至今,特別是伺服器端,涉及到的知識 內容,非常廣泛。這對程式設計師的要求會越來越高。如果採用成熟,穩健的框架,那麼一些基礎的工作,比如,網路操作 資料庫訪問 會話管理等都可以讓框架來處理,那麼程式開發人員可以把精力放在具體的業務邏輯上面。使用web框架開發web應用程式可以降低開發難度,...

Flask 學習筆記

因為mac自帶了python2.7,所以這個文章是基於2.7版本的 依賴於兩個外部庫 werkzeug和jinjia2.werkzeug是乙個wsgi工具集,jinjia2負責渲染模版 2.安裝 1 mac osx或linux sudo pip install virtualenv mkdir my...