python对象不可订阅_python – ‘NoneType’对象不可订阅

参见英文答案 > How to get POSTed json in Flask?                                    4个

我正在创建一个使用flask python编写的服务器的ios应用程序,当我与服务器建立连接以注册用户时,我一直在获取’NoneType’对象,这不是我的server.py文件中的可订阅错误.基本上我的问题是导致此错误的原因以及我如何解决此问题.此外,如果有人能指出我在不同或更简单的方式做正确的方向,我将不胜感激!

这是server.py文件:

import bcrypt

from flask import Flask, request, make_response,jsonify

from flask_restful import Resource, Api

from pymongo import MongoClient

from json import JSONEncoder

from bson.objectid import ObjectId

from functools import wraps

app = Flask(__name__)

mongo = MongoClient('localhost', 27017)

app.db = mongo.eventure_db

app.bcrypt_rounds = 12

api = Api(app)

# Authentication code.

def check_auth(username, password):

# check_auth should access the database and check if the username + password are correct.

# create a collection to hold the users.

user_collection = app.db.users

user = user_collection.find_one({'username': username})

if user is None:

return False

else:

# check if hash generated matches stored hash

encodedPassword = password.encode('utf-8')

if bcrypt.hashpw(encodedPassword, user['password']) == user['password']:

return True

else:

return False

# User resource

class User(Resource):

def post(self):

if (request.json['username'] == None

or request.json['password'] == None):

return ({'error': 'Request requires username and password'},

400,

None)

user_collection = app.db.users

user = user_collection.find_one({'username': request.json['username']})

if user is not None:

return ({'error': 'Username already in use'}, 400, None)

else:

encodedPassword = request.json['password'].encode('utf-8')

hashed = bcrypt.hashpw(

encodedPassword, bcrypt.gensalt(app.bcrypt_rounds))

request.json['password'] = hashed

user_collection.insert_one(request.json)

@requires_auth

def get(self):

return (None, 200, None)

api.add_resource(User, '/eventure/api/v1.1/user/')

# Must define a custom JSON Serializer for flask_restful

# this is because ObjectId is not a string, and therefore,

# Flask's default serializer cannot serialize it.

@api.representation('application/json')

def output_json(data, code, headers=None):

resp = make_response(JSONEncoder().encode(data), code)

resp.headers.extend(headers or {})

return resp

if __name__ == '__main__':

app.config['TRAP_BAD_REQUEST_ERRORS'] = True

app.run(host='localhost', port=8789, debug=True)

这是我在swift中的注册函数:

@IBAction func register(_ sender: AnyObject) {

let url = URL(string: "http://localhost:8789/eventure/api/v1.1/user/")

var request = URLRequest(url: url!)

request.httpMethod = "POST"

request.setValue(generateBasicAuthHeader(username: username.text!, password: password.text!), forHTTPHeaderField: "Authorization")

let session = URLSession.shared

let task = session.dataTask(with: request) { data, response, error in

if let response = response, let data = data {

print(String(data: data, encoding: String.Encoding.utf8))

}

}

task.resume()

self.username.text = ""

self.password.text = ""

}

追溯:

[28/Oct/2016 19:22:33] "POST /eventure/api/v1.1/user/ HTTP/1.1" 500 -

Traceback (most recent call last):

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1836, in __call__

return self.wsgi_app(environ, start_response)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1820, in wsgi_app

response = self.make_response(self.handle_exception(e))

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask_restful/__init__.py", line 270, in error_router

return original_handler(e)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1403, in handle_exception

reraise(exc_type, exc_value, tb)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/_compat.py", line 32, in reraise

raise value.with_traceback(tb)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1817, in wsgi_app

response = self.full_dispatch_request()

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1477, in full_dispatch_request

rv = self.handle_user_exception(e)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask_restful/__init__.py", line 270, in error_router

return original_handler(e)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1381, in handle_user_exception

reraise(exc_type, exc_value, tb)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/_compat.py", line 32, in reraise

raise value.with_traceback(tb)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1475, in full_dispatch_request

rv = self.dispatch_request()

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/app.py", line 1461, in dispatch_request

return self.view_functions[rule.endpoint](**req.view_args)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask_restful/__init__.py", line 471, in wrapper

resp = resource(*args, **kwargs)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask/views.py", line 84, in view

return self.dispatch_request(*args, **kwargs)

File "/Users/Dynee/eventure-backend-api/development/lib/python3.5/site-packages/flask_restful/__init__.py", line 581, in dispatch_request

resp = meth(*args, **kwargs)

File "/Users/Dynee/eventure-backend-api/server.py", line 128, in post

if (request.json['username'] == None

TypeError: 'NoneType' object is not subscriptable

这里还有generateBasicAuthHeader函数:

func generateBasicAuthHeader(username: String, password: String) -> String {

let loginString = String(format: "%@:%@", username, password)

let loginData = loginString.data(using: String.Encoding.utf8)!

let base64LoginString = loginData.base64EncodedString()

let basicAuthHeader = "Basic \(base64LoginString)"

return basicAuthHeader

}

解决方法:

您需要显式地将content-type设置为application / json,以使request.json在flask中正常工作.如果未设置标头,则request.json将返回None.

但建议从post请求中获取烧瓶中的json数据是使用request.get_json()

在使用ios应用程序之前,我还会建议您使用漂亮的requests模块测试您的api.

>>> import requests

>>> requests.post(url, json={'name': 'hello world'})

它已经设置了生成json请求所需的相应头

如果它与请求模块一起使用,那么您可以确定它将适用于您的ios应用程序.你只需要确保你正在设置正确的内容类型.

您可以强制告诉flask忽略内容类型标题

request.get_json(力=真)

标签:python,rest,flask,flask-restful

来源: https://codeday.me/bug/20190715/1465402.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值