2016-10-28 5 views
0

Ich erstelle eine iOS-App, die einen Server in Flasche + Python verwendet, und wenn ich eine Verbindung zum Server eine Benutzer registrieren, ich bekomme immer ein 'NoneType' Objekt ist nicht einklagbar Fehler in meiner server.py Datei. Grundsätzlich ist meine Frage, was diesen Fehler verursacht und wie ich das beheben kann. Auch wenn mir jemand in die richtige Richtung verschiedene oder einfachere Wege zeigen könnte, würde ich es danken, danke! Hier'NoneType' -Objekt ist nicht unterscheidbar

ist die server.py Datei:

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) 

Und das ist meine Registerfunktion in 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 = "" 



} 

Zurückverfolgungs:

[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 

Auch hier ist die Funktion 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 
} 
+0

zeigen die vollständige Rückverfolgung zu ignorieren. Wo passiert der Fehler? Wie auch immer es ist, dass du etwas wie "x [y]" gemacht hast und "x" ist 'None'. –

+0

Also ich vermute in meinem Fall request.json ['username'] wird nicht funktionieren, da request.json keinen Wert hat? – Dynee

+0

print 'request.json' und Sie sehen es ist' None' – furas

Antwort

4

Sie müssen content-type explizit auf application/json für request.json einstellen, damit es in der Flasche ordnungsgemäß funktioniert. Wenn die Kopfzeile nicht festgelegt ist, gibt request.json None zurück.

Aber die empfohlen, json Daten in Kolben aus einer Post-Anforderung zu erhalten, ist request.get_json()

Ich werde auch zu verwenden, bitten Sie Ihre api mit den geschickten requests Modul zu testen, bevor Sie Ihre ios Anwendung.

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

Es ist bereits die entsprechenden Header setzt erforderlich eine json Anfrage

zu machen, wenn es mit dem requests Modul funktioniert, dann können Sie sicher sein, dass es mit Ihrer ios Anwendung funktionieren wird. Sie müssen nur sicherstellen, dass Sie die richtige content-type einstellen.

Sie können mit Nachdruck Kolben erzählen die content-type Header mit

request.get_json(force=True)

+0

oh das war ein fehler meinerseits ... ich meinte eigentlich 'json' – danidee

Verwandte Themen