- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Tastypie 中编写自定义身份验证。基本上,我想使用 post 参数进行身份验证,我根本不想使用 django 身份验证,所以我的代码看起来像:
class MyAuthentication(Authentication):
def is_authenticated(self, request, **kwargs):
if request.method == 'POST':
token = request.POST['token']
key = request.POST['key']
return is_key_valid(token,key)
"error_message": "You cannot access body after reading from request's data stream"
class MultipartResource(object):
def deserialize(self, request, data, format=None):
if not format:
format = request.META.get('CONTENT_TYPE', 'application/json')
if format == 'application/x-www-form-urlencoded':
return request.POST
if format.startswith('multipart'):
data = request.POST.copy()
data.update(request.FILES)
return data
return super(MultipartResource, self).deserialize(request, data, format)
最佳答案
问题是 Content-Type
在您的请求标题中未正确设置。 [ Reference ]
Tastypie 只识别 xml
, json
, yaml
和 bplist
.所以在发送POST请求时,需要设置Content-Type
在其中任何一个的请求 header 中(例如,application/json
)。
编辑 :
似乎您正在尝试通过以下方式发送包含文件的多部分表单
好吃。
Issac Kelly 关于 Tastypie 文件上传支持的一点背景知识
路线图 1.0 最终版(尚未发布):
- Implement a Base64FileField which accepts base64 encoded files (like the one in issue #42) for PUT/POST, and provides the URL for GET requests. This will be part of the main tastypie repo.
- We'd like to encourage other implementations to implement as independent projects. There's several ways to do this, and most of them are slightly finicky, and they all have different drawbacks, We'd like to have other options, and document the pros and cons of each
resource.py
, line 452 :
def dispatch(self, request_type, request, **kwargs):
"""
Handles the common operations (allowed HTTP method, authentication,
throttling, method lookup) surrounding most CRUD interactions.
"""
allowed_methods = getattr(self._meta, "%s_allowed_methods" % request_type, None)
if 'HTTP_X_HTTP_METHOD_OVERRIDE' in request.META:
request.method = request.META['HTTP_X_HTTP_METHOD_OVERRIDE']
request_method = self.method_check(request, allowed=allowed_methods)
method = getattr(self, "%s_%s" % (request_method, request_type), None)
if method is None:
raise ImmediateHttpResponse(response=http.HttpNotImplemented())
self.is_authenticated(request)
self.is_authorized(request)
self.throttle_check(request)
# All clear. Process the request.
request = convert_post_to_put(request)
response = method(request, **kwargs)
# Add the throttled request.
self.log_throttled_access(request)
# If what comes back isn't a ``HttpResponse``, assume that the
# request was accepted and that some action occurred. This also
# prevents Django from freaking out.
if not isinstance(response, HttpResponse):
return http.HttpNoContent()
return response
convert_post_to_put(request)
从这里调用。和
here is the code for convert_post_to_put
:
# Based off of ``piston.utils.coerce_put_post``. Similarly BSD-licensed.
# And no, the irony is not lost on me.
def convert_post_to_VERB(request, verb):
"""
Force Django to process the VERB.
"""
if request.method == verb:
if hasattr(request, '_post'):
del(request._post)
del(request._files)
try:
request.method = "POST"
request._load_post_and_files()
request.method = verb
except AttributeError:
request.META['REQUEST_METHOD'] = 'POST'
request._load_post_and_files()
request.META['REQUEST_METHOD'] = verb
setattr(request, verb, request.POST)
return request
def convert_post_to_put(request):
return convert_post_to_VERB(request, verb='PUT')
request.body
的任何进一步访问的副作用因为
_load_post_and_files()
方法将设置
_read_started
标记为
True
:
request.body
和
_load_post_and_files()
:
@property
def body(self):
if not hasattr(self, '_body'):
if self._read_started:
raise Exception("You cannot access body after reading from request's data stream")
try:
self._body = self.read()
except IOError as e:
six.reraise(UnreadablePostError, UnreadablePostError(*e.args), sys.exc_info()[2])
self._stream = BytesIO(self._body)
return self._body
def read(self, *args, **kwargs):
self._read_started = True
return self._stream.read(*args, **kwargs)
def _load_post_and_files(self):
# Populates self._post and self._files
if self.method != 'POST':
self._post, self._files = QueryDict('', encoding=self._encoding), MultiValueDict()
return
if self._read_started and not hasattr(self, '_body'):
self._mark_post_parse_error()
return
if self.META.get('CONTENT_TYPE', '').startswith('multipart'):
if hasattr(self, '_body'):
# Use already read data
data = BytesIO(self._body)
else:
data = self
try:
self._post, self._files = self.parse_file_upload(self.META, data)
except:
# An error occured while parsing POST data. Since when
# formatting the error the request handler might access
# self.POST, set self._post and self._file to prevent
# attempts to parse POST data again.
# Mark that an error occured. This allows self.__repr__ to
# be explicit about it instead of simply representing an
# empty POST
self._mark_post_parse_error()
raise
else:
self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict()
convert_post_to_VERB()
方法通过设置
request._body
通过调用
request.body
然后立即设置
_read_started=False
以便
_load_post_and_files()
将从
_body
读取并且不会设置
_read_started=True
:
def convert_post_to_VERB(request, verb):
"""
Force Django to process the VERB.
"""
if request.method == verb:
if hasattr(request, '_post'):
del(request._post)
del(request._files)
request.body # now request._body is set
request._read_started = False # so it won't cause side effects
try:
request.method = "POST"
request._load_post_and_files()
request.method = verb
except AttributeError:
request.META['REQUEST_METHOD'] = 'POST'
request._load_post_and_files()
request.META['REQUEST_METHOD'] = verb
setattr(request, verb, request.POST)
return request
关于django - 如何访问 Tastypie 自定义身份验证中的 POST 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522332/
我想在 GET 响应中包含一些字段,并在 POST 确认响应中包含较小的字段子集。我必须在 alter_detail_data_to_serialize 中拥有大量 del bundle['field
我在 tastypie 中有一个简单模型的 ModelResource,它有一个 id 和一个名称。 XML 输出如下所示。但我想用我的模型名称代替“对象”。我似乎一直在为如何解决这个问题而苦苦挣扎—
我有一个 Tastypie ModelResource,它从常规 Django 模型获取其字段。我想将 Tastypie 资源上的某些字段设置为只读,即使它们在底层模型中是可写的。这可以通过简单的方式
我知道如何为 tastypie 资源设置身份验证/授权:通过资源 Meta 类中的设置。但是,如何验证/授权对顶级模式的访问? 例如,我可以对位于/api/v1/resource 的资源进行身份验证/
第一个型号: class Profile(models.Model): username = models.CharField( _('username'),
尝试通过 python requests 以及命令行 cURL 提交 PATCH 请求,我收到以下响应: >>> r = requests.patch(url) >>> r.text u'{"erro
我在通过 tastypie api 保存项目时遇到问题。 (POST 方法) 这是我的 api.py 代码。 from tastypie.resources import ModelResource,
我在玩重客户端应用程序。 想象一下我有这个模型: class Category(models.Model): name = models.CharField(max_length=30)
是否可以使用tastypie 在相关模型上包含字段? 根据我下面的模型:如果我将一个 VideoContent 和一个 TextContent 实例持久化到数据库,那么我可以从我的 Content 资
我希望向我的 Tastypie 驱动的 API 添加某种分析。我真的很喜欢用于常规网站的 Google Analytics,但显然它不适用于 API。您通常如何对 API 进行分析?是否有任何可用于
我正在创建UserResource和UserProfileResource。当我创建一个新用户时,我看到我的用户配置文件数据库表也正在更新。哪个好但是当我得到用户时,我得到一个错误,说: The mo
我有这个代码: #api model class VideoResource(ModelResource): class Meta: queryset = Video.obje
我正在为一个项目开发 API,我通过 OrderProducts 建立了 Order/Products 关系,如下所示: 在目录/models.py class Product(models.Mode
我设置了 Django Tastypie API。 我想在数据库中查询与名称匹配的对象数。 这在现有模型资源上是否可行,或者我是否需要设置新资源来处理这种特定情况? (这些数据通常在结果的元数据部分返
我试图让我的 api 给我与tastypie 的反向关系数据。 我有两个模型,DocumentContainer 和 DocumentEvent,它们的关系如下: DocumentContainer
我正在构建一个 django 美味的 api,我在 ManyToMany 中添加元素时遇到问题关系 例子, 模型.py class Picture(models.db): """ A pict
我正在尝试创建一个具有 0 到无限评论的资源(观察)。我陷入了以下错误: "error": "The model '' has an empty attribute 'comments' and do
我无法让这个为我的生活工作。 我在 api.py 中有这个 class catResource(ModelResource): class Meta: queryset = c
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 4年前关闭。 Improve this qu
我正在使用 Tastypie 为 Django 应用程序创建 REST API,并希望能够在一个 POST 中创建新对象和相关对象。相关对象由用于查找它们的名称指定,如果找不到名称,我想创建新对象。
我是一名优秀的程序员,十分优秀!