我正在尝试使用OAuth开发REST提供程序。我正在使用Django RESTFramework和DjangoOAuthToolkit。我做了一个GET并且它工作得很好,但我正在尝试使用POST,服务器响应{“detail”:“方法'POST'不允许。”} 这是我的代码:
# views.py
@api_view(['POST'])
def pruebapost(request):
usuario = User()
access_token = Token.objects.get(
key=request.POST['oauth_token']
)
usuario = access_token.user
content = {'saludo': usuario.username}
return Response(content)
# settings.py
OAUTH_AUTHORIZE_VIEW = 'principal.views.oauth_authorize'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.OAuthAuthentication',
),
}
我正在使用它作为“测试”客户端:
import urlparse
import oauth2 as oauth
import requests
consumer_key = "clave"
consumer_secret = "secreto"
consumer = oauth.Consumer(consumer_key, consumer_secret)
client = oauth.Client(consumer)
resource_url = 'http://blablabla.pythonanywhere.com/prueba'
consumer = oauth.Consumer(key='clave', secret='secreto')
token = oauth.Token(key='e7456187a43141af8d2e0d8fa99b95b9',
secret='3wRIKoacff16tcew')
oauth_request = oauth.Request.from_consumer_and_token(
consumer,
token,
http_method='POST',
http_url=resource_url,
parameters={'hola':'pepe'}
)
oauth_request.sign_request(
oauth.SignatureMethod_HMAC_SHA1(),
consumer,
token
)
url = oauth_request.to_url()
response = requests.post(url, oauth_request.to_postdata())
print response.content
我不明白REST Framework文档中有关405方法不允许的内容
“发生传入请求但未映射到视图上的处理程序方法时引发。”
由于
答案 0 :(得分:38)
问题解决了,我错过了网址上的一个斜线。
此响应代码(405)可能来自任何数量的问题,但通常最终会导致您使用的是错误的URL(如本例所示),或者您使用的是错误的请求方法。有时它们都是!
我经常看到有人在尝试更新单个资源(/api/res/1
)时遇到此问题,但是他们使用的列表网址(/api/res
)并不允许要求提出。反过来也可能发生这种情况,有人正在尝试创建新实例,但他们正在向单个对象发送POST
请求。
在某些情况下,正在使用错误的网址,因此用户正在请求标准的非API视图,并认为它是API视图(/res
而不是/api/res
)。所以一定要经常检查你的网址!
答案 1 :(得分:1)
>>> y.astype(np.int32)
array([ 101, 204, 411, 826, 1657, 3320, 6647, 13302, 26613, 53236])
请改为“从rest_framework导入泛型导入”并将其更改为
class ApiIndexView(APIView)
通用列表中有很多视图createAPIview用于获取和发布,createapiview仅用于发布方法
答案 2 :(得分:0)
就我而言,我的路由器具有相同的基本网址
router.register('sales', SalesViewSet, basename='sales')
我的网址格式是
urlpatterns = [
path('', include((router.urls, app_name))),
path('sales/analytics/', Analytics.as_view(), name='create'),
]
我收到sales/analytics/
的405错误。解决的办法是更改urlpatterns的顺序。
urlpatterns = [
path('sales/analytics/', Analytics.as_view(), name='create'),
path('', include((router.urls, app_name))),
]
答案 3 :(得分:0)
关于SO的第一个答案。在尝试了所有内容并在过去的6个小时中感到沮丧之后,它终于打击了我,我发现了可能发生这种情况的另一个原因。 我很简单地没有登录到/ admin。我登录到/ admin并解决了“ HTTP 405 method not allowed”问题,即帖子视图未显示。我希望这可以帮助任何陷入此类问题的人。