Standardní 401 odezva při použití HTTP auth v baňce

hlasů
16

V baňce, já používám následující úryvek povolit HTTP auth:

def authenticate():
    return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm=Login Required'})

Nyní, v mé dosavadní zkušenosti s Baňka, pokud něčí pověření jsou nesprávná a já chci, aby věděli, můžu stačí zavolat:

abort(401)

To vám dává základní apache 401 odpověď. Ví někdo, jak mohu implementovat, že s úryvkem výše?

dík

Položena 24/10/2011 v 15:32
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
12

Baňka je abortpochází přímo z Werkzeug. Je to callable objekt, který vyvolává různé předem definované výjimky HTTP (podtřídy HTTPException) na vyžádání. Podívejte se na kód zde pro detaily.

Předdefinované Unauthorized(která je mapována na 401) definuje pouze kód a zprávy, ale nikoli WWW-Authenticatezáhlaví, která, jak víte, je nutná ke spuštění přihlašovacího-vyskakovací okno s prohlížečem. Záhlaví HTTPExceptionmá se napevno jako [('Content-Type', 'text/html')]v HTTPException.get_headers.

Takže přidat WWW-Authenticatezáhlaví vytvořit svůj vlastní Unauthorizedpodtřídy, přepsat get_headersfunkci a nakonec aktualizovat abort.mappingslovník s ním.

from flask import abort
from werkzeug.exceptions import Unauthorized

class MyUnauthorized(Unauthorized):
    description = '<Why access is denied string goes here...>'
    def get_headers(self, environ):
        """Get a list of headers."""
        return [('Content-Type', 'text/html'),
            ('WWW-Authenticate', 'Basic realm="Login required"')]

abort.mapping.update({401: MyUnauthorized})

Nyní jsou všechny abort(401)hovory budou zvýšit svou vlastní výjimku.

Odpovězeno 23/11/2011 v 07:01
zdroj uživatelem

hlasů
20

Odpovědi na zakázku chyby jsou opravdu docela snadné do baňky. Vytvořte funkci, jehož jediným argumentem je chyba HTTP stavový kód, aby bylo vrátit instance flask.Response a zdobí ji s @ app.errorhandler .

@app.errorhandler(401)
def custom_401(error):
    return Response('<Why access is denied string goes here...>', 401, {'WWWAuthenticate':'Basic realm="Login Required"'})

Pak můžete použít abort(401)na co hrdlo ráčí.

Odpovězeno 29/11/2011 v 21:04
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more