簡體   English   中英

Python Flask裝飾器和Apache mod_wsgi

[英]Python Flask Decorators and Apache mod_wsgi

我已經創建了Flask / Python應用程序的一個相當棘手的示例,然后決定將代碼拆分到兩個文件中,因此我將所有用於身份驗證的裝飾器移動到了單獨的文件中,如下所示:

#### test.py
from flask import Flask, request, abort, request, make_response, url_for, jsonify
from flask.ext.httpauth import HTTPBasicAuth
import pypyodbc, json, collections, _db, _sc
from customauth import CustomHTTPBasicAuth

app = Flask(__name__)
app.debug = True

from werkzeug.debug import DebuggedApplication
application = DebuggedApplication(app, evalex=True)

@app.errorhandler(400)
def not_found(error): return make_response(jsonify( { 'error': 'Bad request' } ), 400)
@app.errorhandler(404)
def not_found(error): return make_response(jsonify( { 'error': 'Not found' } ), 404)

auth = CustomHTTPBasicAuth()

@app.route('/hello')
@auth.login_required
def hello_world():
    name = request.args.get('name','')
    return 'Hello ' + name + '!'

if __name__ == '__main__':
    app.run()



#### customauth.py
from flask import Flask, jsonify, make_response, request
from flask.ext.httpauth import HTTPBasicAuth
import md5, socket

class CustomHTTPBasicAuth(HTTPBasicAuth):
    def __init__(self):
    super(CustomHTTPBasicAuth, self).__init__()

        @self.get_password
        def get_password(username):
            if (md5.new(username).hexdigest() == '0cc175b9c0f1b6a831c399e269772661'): #'0cc175b9c0f1b6a831c399e269772661' is md5('a')
                return '0cc175b9c0f1b6a831c399e269772661'
            return None 

        @self.hash_password
        def custom_authenticate(password):
            return '0cc175b9c0f1b6a831c399e269772661'

        @self.error_handler
        def unauthorized():
            return make_response(jsonify( { 'error': 'Unauthorized access' } ), 401)

#### wsgi.py
import sys
sys.path.insert(0, "c:/testflask/test")

from flask1 import app
application = app
  1. 第一個問題是:此代碼與python test.py一起執行時可以正常工作。身份驗證表單將彈出,要求輸入用戶名和密碼,輸入“ a”后,將通過“ a”身份驗證,並顯示“ Hello + what”。 但是當通過Apache mod_wsgi執行時,它無法按預期的身份運行,身份驗證表單將顯示無數次。 請有人可以解釋這段代碼在python而不是mod_wsgi下運行,有沒有辦法解決? 我以為我在裝飾器上做錯了什么,但我不確定是什么,它也無法回答為什么它是通過python而不是通過mod_wsgi運行的。

  2. 另一件事是如何通過apache mod_wsgi而不是“內部服務器錯誤”頁面來獲取調試頁面? 我已經嘗試過使用“ werkzeug.debug”和互聯網上的其他一些建議,但是對我來說真的沒有用。

謝謝,

我發現第一個項目符號是Apache設置的解決方案,唯一需要做的就是在配置文件中添加WSGIPassAuthorization On。

仍在嘗試尋找調試解決方案...

如果Flask調試器檢測到它正在多進程配置中運行,則它可能無法工作,如果您使用的是嵌入式模式,mod_wsgi經常會遇到這種情況。 確保您使用的是mod_wsgi的守護程序模式:

WSGIDaemonProcess mysite
WSGIProcessGroup mysite

請注意,請勿將“ processes = 1”設置為WSGIDaemonProcess。 將其默認設置為1。將'processes'選項與任何值一起使用將導致wsgi.multiprocess為True,這可能是導致Flask調試器被禁用的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM