В настоящее время я работаю над проектом по созданию приложения продавца, где продавец может загрузить изображение меню и некоторую дополнительную информацию, такую как цена и название меню.но я остановился на методе запроса POST, потому что в это время мне нужно загрузить изображение с некоторыми текстовыми данными вместо только текстовых данных.
Я использую PyQt5.
Это мой API веб-сервер.Я использую Django Rest Framework для создания этого.
[
Это модель меню:
class Menu(models.Model):
image = models.ImageField(upload_to=path_and_rename)
name = models.CharField(max_length=100)
price = models.IntegerField()
category = models.IntegerField()
availability = models.BooleanField(default=False)
# booked = models.IntegerField()
sellerID = models.ForeignKey(Seller, on_delete=models.PROTECT)
Это сериализаторы меню:
class MenuSerializer(serializers.ModelSerializer):
class Meta:
model = models.Menu
fields = ('id', 'image', 'name', 'price',
'category','availability', 'sellerID')
Это набор параметров меню:
class MenuViewset(viewsets.ModelViewSet):
queryset = models.Menu.objects.all()
serializer_class = serializers.MenuSerializer
Я попытался использовать метод в этом ответе: здесь
Это моя реализация этого метода:
def upload(self):
file1 = QFile("/home/shalahuddin/Desktop/jamu.jpg")
file1.open(QFile.ReadOnly)
url = "http://127.0.0.1:8000/api/menu/"
nama = QByteArray()
nama.append("ABCD")
harga = QByteArray()
harga.append(str(999))
kategori = QByteArray()
kategori.append(str(0))
ada = QByteArray()
ada.append(str(True))
idseller = QByteArray()
idseller.append(str(2))
data = {"name": nama, "price": harga, "category": kategori, "availability": ada, "sellerID": idseller}
files = {"image": file1}
multipart = self.construct_multipart(data, files)
request_qt = QNetworkRequest(QUrl(url))
request_qt.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
'multipart/form-data; boundary=%s' % multipart.boundary())
self.manager = QtNetwork.QNetworkAccessManager()
self.manager.finished.connect(self.handleResponseMenu)
self.manager.post(request_qt, multipart)
def handleResponseMenu(self, reply):
er = reply.error()
data = json.loads(str(reply.readAll(), 'utf-8'))
file = open("/home/shalahuddin/Desktop/testfile.txt", "w")
file.write(str(reply))
if er == QtNetwork.QNetworkReply.NoError:
bytes_string = reply.readAll()
data = json.loads(str(bytes_string, 'utf-8'))
# print(data)
QMessageBox.information(self, "Menu", "Upload Success!")
else:
errorMessage = "Error occured: " + str(er) + "\n" + str(reply.errorString())
QMessageBox.critical(self, "Error Done", errorMessage)
def construct_multipart(self, data, files):
multiPart = QHttpMultiPart(QHttpMultiPart.FormDataType)
for key, value in data.items():
textPart = QtNetwork.QHttpPart()
textPart.setHeader(QNetworkRequest.ContentDispositionHeader,
"form-data; name=\"%s\"" % key)
textPart.setBody(value)
multiPart.append(textPart)
for key, file in files.items():
imagePart = QtNetwork.QHttpPart()
# imagePart.setHeader(QNetworkRequest::ContentTypeHeader, ...);
fileName = QFileInfo(file.fileName()).fileName()
imagePart.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
"form-data; name=\"%s\"; filename=\"%s\"" % (key, fileName))
imagePart.setBodyDevice(file)
multiPart.append(imagePart)
return multiPart
Но я получил ошибку 302 Bad Request в результате.Данные JSON, которые я получаю:
{
'image': ['No file was submitted.'],
'name': ['Ensure this field has no more than 100 characters.',
'Null characters are not allowed.'],
'price': ['This field is required.'],
'category': ['This field is required.'],
'sellerID': ['This field is required.']
}
Поэтому я хотел бы знать, в чем проблема?Я пытался проследить это неоднократно, но все же, не дать ответа.Я впервые использую многочастный запрос.