как использовать функцию curl POST в Linux терминале для создания документа в python - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь добавить новую запись в документ python, и я думаю, что застрял с проблемой, вызванной функцией curl post. Я приложил файл python и ошибку, полученную при публикации на мой URL. Может ли кто-нибудь любезно указать мне правильное направление.

Я не понимаю код ошибки, чтобы определить, происходит ли проблема из python кода, но я подозреваю, что проблема с URL-адресом curl.

#!/usr/bin/python
import json
from bson import json_util
from bson.json_util import dumps
import bottle
from bottle import route, run, request, abort
#imports for database
from pymongo import MongoClient
connection = MongoClient('localhost', 27017)
db = connection['city']
collection = db['inspections']

# set up URI paths for REST service
@route('/hello', method='GET')
def get_hello():
    word = '"'+request.GET.get('name', None)+'"'
    string="{hello:"+word+"}"
    return json.loads(json.dumps(string, indent=4, default=json_util.default))

@route('/strings', method='POST')
def run_post():
    first = '"'+request.json.get('string1')+'"'
    second = '"'+request.json.get('string2')+'"'
    data="{first:"+first+",second:"+ second+"}"
    return json.loads(json.dumps(data, indent=4, default=json_util.default))


@route('/create', method='POST')
def run_create(): 
    myid = request.json.get('id')
    print(myid)
    cert_number = request.json.get('certificate_number')
    bus_name = request.json.get('business_name')
    date = request.json.get('date')
    result = request.json.get('result')
    sector = request.json.get('sector')
    added_id = collection.insert({"id":myid,"certificate_number":cert_number,"business_name":bus_name,"date":date,"result":result,"sector":sector})
    added_doc = collection.find_one({"_id":added_id})
    return json.loads(json.dumps(added_doc, indent=4, default=json_util.default))

#url does not allow spacing when passing an argument,
#therefore i use underscores when passing the business_name and the remove them
#when creating the query
@route('/read', method='GET')
def get_read():
    word = request.params.get('business_name')
    word = word.replace("_"," ")
    found_doc = collection.find({"business_name":{'$regex':word}}) #will still get results when user pass parameter with white space
    return dumps(found_doc)

@route('/update', method='GET')
def get_update(rslt = "Violation Issued"):
    myid = request.query.id
    query = { "id" :myid}
    new_update =  { "$set":{"result":rslt}}
    collection.update_one(query,new_update)
    updated_doc = collection.find_one({"id":myid})
    return json.loads(json.dumps(updated_doc, indent=4, default=json_util.default))

@route('/delete', method='GET')
def get_update():
    myid = request.query.id
    query = {"id" :myid};
    print(query)
    result = collection.delete_one(query)
    return "document with id "+myid+" Has beed deleted from the City Collection"



if __name__ == '__main__':
    run(debug=True,reloader = True)
    #run(host='localhost', port=8080)

Ошибка: post curl url

Возвращено HTML: post terminal error

python Ошибка: error on run terminal

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Проблема в том, что в один момент из json в вашем запросе curl вы использовали вместо ". Поэтому синтаксический анализатор json выдает ошибку.

Поэтому вместо

"business_name" : “ACME Test INC."

напишите:

"business_name" : "ACME Test INC."
0 голосов
/ 12 февраля 2020

Не уверен, что вы решили это, но здесь мы go. Якоб был прав, что вы использовали вместо " Далее, получите значения из документа, который вы вставляете

data = request.json (Contains parsed content)

Присвойте значение нужным вам переменным, таким как id

id = data['id']

Сохранение всех значений в словарной переменной (я думаю, что это намного чище)

document = {"id":myid,"certificate_number":cert_number,"business_name":bus_name,"date":date,"result":result,"sector":sector}

Наконец, используйте insert_one и перехватывайте ошибки

try:
    collection.insert_one(document)
    print("CREATED NEW DOCUMENT")

except Exception as e:
    print("ERROR: ", e)

Также Есть несколько способов исправить проблему с "пробелом", которую вы упоминаете для запросов cURL. Один из способов - просто добавить% 20 ​​между пробелами, например, так:

ACME%20TEST%20INC.

Надеюсь, это поможет.

...