Vynutit Content-Type nebo vystavit request.data v baňce na známý typ obsahu

hlasů
7

Jsem obnovovat dopravu v Pythonu / baňky a používám na problém s tím, jak stávající klienti přihlásí. Mám tak, aby odpovídala schématu stávající klienty z důvodů kompatibility.

Stávající klienti mít uživatelské jméno, heslo a base64 jej zakódovat. To není základní ověření HTTP, přestože zněl podobné. Níže je nějaký ukázkový kód, který by vytvořil tento požadavek přihlášení.

credentials = {
            'username': 'test@example.com',
            'password': 'password'
}
data = b64encode(urlencode(credentials))
request = urllib2.Request(loginURL)
request.add_data(data)
# request.add_header('Content-Type', 'application/gooblygop')
# 'application/x-www-form-urlencoded' seems to be a default Content-Type
login = urllib2.urlopen(request)

Na straně serveru, beru POST data a base64 dekódování je získat informace o uživatelské jméno a heslo znovu.

flask server:
@app.route('/login', methods=['POST'])
def login():
    error = None
    if request.method == 'POST':
        # post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20=
        data = b64decode(request.data)
        # decoded data: password=default&email=test%40example.com
        return('ok')

Problém je typ obsahu. Mám-li určit neznámou Content-Type v klientovi (application / gooblygop), Flask vystavuje data POST k request.data a mohu dekódovat base64 řetězec. Nechá-li se na Content-Type jako výchozí (application / x-www-form-urlencoded), surová data není vystavena request.data a já nevím, jak načíst base64 řetězec a využít ji.

Stávající klient software jsou všechny do značné míry výchozí x-www-form-urlencoded, ale nemohu spolehnout na to vždy být případ.

V podstatě, potřebuji spolehlivé, server-side způsob přístupu k této zakódovaný řetězec bez ohledu na to, jaký typ obsahu Klientský program stavy.

Další poznámky: Jsem velmi nový Python, pocházející z PHP pozadí. Takže jsem velmi otevřený návrhům. Také tento projekt je určen především pro osobní potřebu.

Položena 17/08/2011 v 00:42
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Chcete-li se podívat na request.formobjektu při jednání s urlencoded míst s normálními MIME typů. V tomto případě budete mít neobvyklou formu, ale tady je způsob, jak to udělat:

# mkreq.py
from urllib import urlencode
import urllib2
from base64 import b64encode

credentials = {
            'username': 'test@example.com',
            'password': 'password'
}
data = b64encode(urlencode(credentials))
request = urllib2.Request("http://localhost:5000/login")
request.add_data(data)
request.add_header('Content-Type', 'application/gooblygop')
# 'application/x-www-form-urlencoded' seems to be a default Content-Type
login1 = urllib2.urlopen(request).read()
print(login1)
request2 = urllib2.Request("http://localhost:5000/login")
request2.add_data(data)
login2 = urllib2.urlopen(request2).read()
print(login2)

Pravděpodobně budete chtít změnit přihlašovací bit pro kontrolu MIME, zde je verze s minimálními změnami svého aktuálního nastavení:

@app.route('/login', methods=['POST'])
def login():
    error = None
    if request.method == 'POST':
        # post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20=
        data = b64decode(request.data)
        # decoded data: password=default&email=test%40example.com
        if not data:
            data = b64decode(request.form.keys()[0])
        special_mimetype = request.mimetype
        return(special_mimetype + '\n' + data)

To je výstup první ukázka kódu se dvěma žádostmi:

bvm$ python mkreq.py
application/gooblygop
username=test%40example.com&password=password
application/x-www-form-urlencoded
username=test%40example.com&password=password
Odpovězeno 17/08/2011 v 01:58
zdroj uživatelem

hlasů
1

Přemýšleli jste o použití JSON předat svá data v poště? Baňka má vestavěnou podporu pro předávání dat JSON. Navíc, pokud si nastavit Content-Type v záhlaví do application / json pak baňka automaticky dejson data POST pro vás a dát ji do request.json

Zde je žádající aplikace

import urllib2
import json

if __name__ == "__main__":
  headers = {'Content-Type':'application/json'}
  post_data = {"user":"test_user"}
  print "Posting request"
  req = urllib2.Request("http://localhost:5000/login", json.dumps(post_data), headers)
  resp = urllib2.urlopen(req)
  print "Response was %s" % resp.read()  

To je názor baňka

from flask import request

@app.route('/login', methods=['POST'])
 def login():

  user = request.json['user']
  return user

Navrhuji, abyste testovat pomocí zvlnění stejně, pokud používáte Linux terminálu. Zde je příklad

curl -X POST -H "Content-Type:application/json" -s -d '{"user":"This is the username"}' 'localhost:5000/login'

This is the username
Odpovězeno 27/09/2011 v 04:09
zdroj uživatelem

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