如何正确地在Django Rest框架中允许发布请求?

时间:2019-07-08 16:01:33

标签: django django-rest-framework django-views django-urls

如何在django rest框架中正确允许发布请求?

现在我在创建api / v3 / exchange / order的POST请求时出错(使用POST)

Traceback (most recent call last):
  File "/home/skif/.local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/home/skif/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/skif/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/skif/.local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/skif/.local/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/skif/.local/lib/python3.6/site-packages/rest_framework/views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "/home/skif/.local/lib/python3.6/site-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/skif/.local/lib/python3.6/site-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/skif/PycharmProjects/beex2/app_ccxt/external_api.py", line 44, in post
    return getattr(self, self.name)(request)
  File "/home/skif/.local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/skif/.local/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/skif/.local/lib/python3.6/site-packages/rest_framework/views.py", line 478, in dispatch
    request = self.initialize_request(request, *args, **kwargs)
  File "/home/skif/.local/lib/python3.6/site-packages/rest_framework/views.py", line 382, in initialize_request
    parser_context=parser_context
  File "/home/skif/.local/lib/python3.6/site-packages/rest_framework/request.py", line 160, in __init__
    .format(request.__class__.__module__, request.__class__.__name__)
AssertionError: The `request` argument must be an instance of `django.http.HttpRequest`, not `app_ccxt.external_api.ApiExternalCCXT`.
[08/Jul/2019 15:40:31] "POST /api/v3/exchange/order HTTP/1.1" 500 44749

我尝试将请求实例更改为HttpRequest,但未做任何更改。

我在external_api.py中的代码:

from django.shortcuts import render
from django.http import HttpResponse
from django.http import HttpRequest
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from rest_framework import routers, serializers, viewsets
from beeqb.models import *
from rest_framework import status
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializer import *
from rest_framework.renderers import JSONRenderer
from beeqb.handlers.WalletHandler import select_wallet, get_crypt_wallet, make_sub_wallet
from django.db.models import Q, Sum
import requests
import json
from beeqb.handlers import ChartHandler, OrderHandler, WithdrawHandler, AddressHandler
from rest_framework import generics
from datetime import timedelta, datetime
import pytz
import time
from .api_lib import *
from beeqb.handlers.ChartHandler import *
from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema
from beeqb.models import Order, OrdersTrigger, ORDER_WAIT, ORDER_BUY, ORDER_SELL, ORDER_DONE
from django.template.context_processors import csrf
from rest_framework.views import APIView
from rest_framework.response import Response
import logging

class ApiExternalCCXT(APIView):
    name = ''
    def get(self, request, *args, **kwargs):
        return getattr(self, self.name)(request)

    def post(self, request, *args, **kwargs):
        return getattr(self, self.name)(request)

    @api_view(['POST', 'GET'])
    def api_create_order(self, request):
    “““
    the method must accept POST requests
    HERE SOME CODE
    “““

    def api_get_fetch_orders(self, request):
    “““
    the method accepted GET requests and working fine
    HERE SOME CODE
    “““

我的urls.py

from django.contrib import admin
from django.urls import include, path
from rest_framework import routers
from django.conf.urls import include, url
import beeqb
from .views import ApiCCXT, ApiOrder, Ticker, SymbolsDetails, ApiTransactions, ExampleView
from .serializer import *
from rest_framework.documentation import include_docs_urls
from app_ccxt.external_api import ApiExternalCCXT
import app_ccxt.ChartHandler
from app_ccxt.ApiCCXT.ChartHandlerCCXT import ApiChartHandlerCCXT
urlpatterns = [
  “““ URLS “““
    url(r'^exchange/order',        ApiExternalCCXT.as_view(name='api_create_order')),
  “““ URLS “““

    url(r'^exchange/fetch_open_orders',  ApiExternalCCXT.as_view(name='api_get_fetch_open_orders')),

  “““ URLS “““

]

如果我尝试对api_get_fetch_orders方法(交换/ fetch_open_orders)执行GET rquest –一切正常。

我在做什么错?如何在api_create_order方法中获取发布请求? def post()有什么问题?

我认为post()中的所有问题,但无法理解如何修改它以便在几种方法中使用。我需要POST请求此方法以及其他几种方法

我正在使用GET请求:return getattr(self,self.name)(request)

同样,我想处理POST要求。但是这里我有错误。

如果我仅对方法api_create_order使用GET请求(我从代码中删除了post()和@api_view表示法)也都正常工作。

您能帮我吗?

UPD: 带有post()和@api_view表示法的api_create_order()方法的POST / GET请求。

对于POST请求: 请求信息:

USER: AnonymousUser

GET: No GET data

POST:
aaa = '123'
bbb = '234'

FILES: No FILES data

COOKIES: No cookie data

用于GET请求

Request information
USER     AnonymousUser
GET
Variable    Value
token    '521f5013121d0829a946780cb5763ea41042c132'

number  '1139012'

POST 
No POST data

1 个答案:

答案 0 :(得分:0)

这是应该如何组织代码。 REST方法的更多信息。

class OrderApi(ListCreateAPIView):
    name = ''
    def get(self, request, *args, **kwargs):
        """This is to fetch the list."""
        return Response()

    def post(self, request, *args, **kwargs):
        """This api to create the order."""
        return Response()

    # No need of `api_create_order` and `api_get_fetch_orders` function. 

您的网址

urlpatterns = [
  “““ URLS “““
    url(r'^exchange/order', OrderApi.as_view())]