Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 强制内容类型或公开烧瓶中已知内容类型的request.data_Python_Base64_Content Type_Flask - Fatal编程技术网

Python 强制内容类型或公开烧瓶中已知内容类型的request.data

Python 强制内容类型或公开烧瓶中已知内容类型的request.data,python,base64,content-type,flask,Python,Base64,Content Type,Flask,我正在用Python/Flask重新创建一个服务,并且在现有客户机的身份验证方式方面遇到了问题。出于兼容性原因,我必须匹配现有的客户端方案 现有客户机使用用户名、密码并对其进行base64编码。这不是HTTP基本身份验证,尽管听起来类似。下面是创建此登录请求的一些示例代码 credentials = { 'username': 'test@example.com', 'password': 'password' } data = b64encode

我正在用Python/Flask重新创建一个服务,并且在现有客户机的身份验证方式方面遇到了问题。出于兼容性原因,我必须匹配现有的客户端方案

现有客户机使用用户名、密码并对其进行base64编码。这不是HTTP基本身份验证,尽管听起来类似。下面是创建此登录请求的一些示例代码

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)
在服务器端,我获取POST数据并对其进行base64解码,以再次获取用户名和密码信息

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')
问题在于内容类型。如果我在客户端(application/gooblygop)中指定了未知的内容类型,Flask会将POST数据公开给request.data,我可以解码base64字符串。如果我将内容类型保留为默认值(application/x-www-form-urlencoded),则原始数据不会公开给request.data,并且我不知道如何检索和使用base64编码的字符串

现有的客户端软件几乎都默认为x-www-form-urlencoded,但我不能总是这样

本质上,我需要一个可靠的服务器端方法来访问编码字符串,而不管客户端程序声明的内容类型是什么


其他说明:我对Python非常陌生,来自PHP背景。因此,我非常愿意接受建议。此外,此项目主要用于个人用途。

在处理带有普通MIMEType的URL编码帖子时,您希望查看
request.form
对象。在本例中,您有一个不寻常的表单,但这里有一种方法:

# 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)
您可能希望修改登录位以检查mimetype,以下是对当前设置进行最小更改的版本:

@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)
这是第一个代码示例的输出,包含两个请求:

bvm$ python mkreq.py
application/gooblygop
username=test%40example.com&password=password
application/x-www-form-urlencoded
username=test%40example.com&password=password

您是否考虑过使用json在帖子中传递数据?Flask内置了对传递json数据的支持。此外,如果将标题中的内容类型设置为application/json,flask将自动为您解除POST数据的json,并将其放入request.json中

这是申请表

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()  
这是烧瓶视图

from flask import request

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

  user = request.json['user']
  return user
如果您使用的是linux终端,我建议您也使用curl进行测试。这里有一个例子

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

This is the username