Python Post данные через командную строку - PullRequest
0 голосов
/ 06 июля 2018

Я много с этим борюсь. Прошел просмотр документации по requests API, но не смог выполнить ее идеально.

Я написал скрипт на python, предназначенный для получения GET, POST',and the remaining REST operations through a command line. GET works fine, and any request from the localhost` url.

Однако я не могу POST новые данные. Например, метод GET выдается так:

request.py -r get -f 1 -u http://127.0.0.1:5002/user 

и данные userID 1 отображаются в формате JSON. user - это имя базы данных, которая содержит эти операции.

Точно так же я хотел бы post новые данные в JSON формате

Я попробовал эту команду, но получаю сообщение об ошибке

request.py -r get -f 7 -u http://127.0.0.1:5002/user {'user':'abc','email':xyz@abc.com} 

getAddrInfoFailed

enter image description here

Ниже приведен код для создания базы данных, а также запросы

from flask import Flask, request
from flask_restful import Resource, Api
import sqlite3
import re

app = Flask(__name__)
api = Api(app)


def validate_email(email):
    match = re.search('^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,4})$', email)
    if match:
        return True
    else:
        return False


def validate_username(username):
    match = re.search('^[A-Za-z0-9_-]{3,20}$', username)
    if match:
        return True
    else:
        return False


def validate_id(id):
    if id.isdigit():
        return True
    else:
        return False


class Users(Resource):
    def get(self, id):
        try:
            conn = sqlite3.connect('curd.db')
            cursor = conn.cursor()
            if validate_id(id):
                query = cursor.execute("SELECT * FROM user WHERE id=?", [int(id), ])
                row = query.fetchone()
                if row:
                    return {'item': {'id': row[0], 'username': row[1], 'email': row[2]}},200
                else:
                    return {'MESSAGE': 'USER NOT FOUND'}, 404
            else:
                return {'MESSAGE': 'INVALID INPUT'}, 400
        except:
            conn.rollback()
        finally:
            conn.commit()
            conn.close()

    def post(self, id):
        try:
            conn = sqlite3.connect('curd.db')
            cursor = conn.cursor()
            usr = request.get_json()
            username = usr['username']
            email = usr['email']
            if validate_id(id) is True and validate_username(username)is True and validate_email(email) is True:
                query = cursor.execute("SELECT * FROM user WHERE id=?", [int(id), ])
                row = query.fetchone()
                if row:
                    return {'MESSAGE': 'USER ID ALREADY EXISTS'}, 400

                else:
                    cursor.execute("INSERT INTO user(id, username, email) VALUES(?,?,?)", [id, username, email])
                    return {'response': 'Success'},201
            else:
                 return {'MESSAGE': 'INVALID INPUT'}, 400
        except:
            conn.rollback()
        finally:
            conn.commit()
            conn.close()

    def put(self, id):
        try:
            conn = sqlite3.connect('curd.db')
            cursor = conn.cursor()
            usr = request.get_json()
            updated_name = usr['username']
            updated_email = usr['email']
            if validate_id(id) and validate_username(updated_name) and validate_email(updated_email):
                query = cursor.execute("SELECT * FROM user WHERE id=?", [int(id), ])
                row = query.fetchone()
                if row:
                    cursor.execute("UPDATE user SET username = '" + str(updated_name) + "',email = '" + str(updated_email) + "' WHERE id = %d" % int(id))
                    return {'response': 'Success'},200
                else:
                    return {'MESSAGE': 'USER NOT FOUND'}, 404
            else:
                 return {'MESSAGE': 'INVALID INPUT'}, 400
        except:
            conn.rollback()
        finally:
            conn.commit()
            conn.close()

    def delete(self, id):
        try:
            conn = sqlite3.connect('curd.db')
            cursor = conn.cursor()
            if validate_id(id):
                query = cursor.execute("SELECT * FROM user WHERE id=?", [id, ])
                row = query.fetchone()
                if row:
                    conn.execute("DELETE FROM user WHERE id = %d" % int(id))
                    return {'response': 'Success'},200
                else:
                    return {'MESSAGE': 'USER NOT FOUND'}, 404
            else:
                 return {'MESSAGE': 'INVALID INPUT'}, 400
        except:
            conn.rollback()
        finally:
            conn.commit()
            conn.close()


api.add_resource(Users,'/user/<string:id>',methods=['GET','POST','PUT','DELETE'])
if __name__ == '__main__':
    app.run(port=5002, debug=True)

requests.py

import requests
import json
import sys
from optparse import OptionParser, make_option

if len(sys.argv) <= 1:
    print('Need at least 1 argument.')
    print("Add -h for Help")
    sys.exit(1)

parser = OptionParser()
parser.add_option('-r', '--request', help="Request Type['GET','POST','PUT','DELETE']",default="")
parser.add_option('-f', '--id', help='id')
parser.add_option('-u', '--url', help="URL String",default="")
(options, args) = parser.parse_args()

print("ID = "+options.id)
print("Request Type = "+options.request)
print("Request URL = "+options.url)

url = options.url+"/"+options.id
data = ''
payload= {'key1':'value1','key2':'value2'}
if options.request == "get":
    response = requests.get(url, data=data)
elif options.request=="post":
    response = requests.post(url, params=payload)
else:
    print("Invalid Request..!!")
print(response.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...