我在使用Django Rest Framework构建我的API时遇到了很多麻烦.我好几天都被困在同一个问题上了.我已经尝试了很多解决方案和代码片段并且问了很多人,但无济于事.我试图遵循文档中的所有说明,但对我来说,它们不清楚且不完整.因此,我非常渴望一个清晰,简洁,完整的工作示例来解决我的问题.
现在这是我的问题:
我按照这里的说明成功构建了一个简单的Django Rest API .这些指令使构建API非常容易,该API返回特定模型的所有实例的列表,或基于用户提供的ID的单个实例.所以,因为我有一个名为MyObject的模型,所以我构建了一个api,当你点击URL/api/myObjects时会返回所有myObjects的列表.如果我点击URL/api/myObjects/60,它会给我带ID为= 60的myObject.到现在为止还挺好!
但我不想这样做.我想要一些更复杂的东西.myObject模型有一个名为getCustomObjects()的方法.此方法本身返回myObjects列表.当我点击URL/api/myObjects/60时,我希望它返回通过在ID == 60的myObject上调用getCustomObjects()生成的列表.这个看似简单的变化让我非常头疼,我无法弄清楚如何去做.原因是因为我想返回一个非标准的对象列表,我不能使用标准的方法来处理模型中描述的ModelViewSet.当我做出我认为应该有效的更改时,我会收到错误.我当前的错误是:base_name未指定参数,并且无法自动确定视图集中的名称,因为它没有.model或.queryset属性..我读过的所有文件都可以解决这个错误,我说我需要指定一个"base_name"参数.该base_name参数的值应该是什么以及我应该如何在我的URL中使用它对我来说非常不清楚.我没有一个很好的解释.这就是我发布完整代码的原因.如果有人可以清楚地告诉我如何解决它,我将非常感激.
我的路线在myApp的url.py中看起来像这样:
from rest_framework import routers
router = routers.DefaultRouter() router.register(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsViewSet)
url(r'^api/', include(router.urls)),
Run Code Online (Sandbox Code Playgroud)
我的模型看起来像这样:
class MyObject(models.Model):
name = models.TextField()
Run Code Online (Sandbox Code Playgroud)
我的Serializer看起来像这样:
class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyObject
fields = ('id', 'name',)
Run Code Online (Sandbox Code Playgroud)
我的Viewset看起来像这样:
class MyObjectsViewSet(viewsets.ViewSet):
def retrieve(self,request,pk=None):
queryset = MyObjects.objects.get(pk=pk).customMyObjectList()
if not queryset:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
serializer = MyObjectSerializer(queryset)
return Response(serializer.data,status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
当我点击/ api/myObjects/60 /时出现以下错误:
`base_name` argument not specified, and could not …Run Code Online (Sandbox Code Playgroud) 我已经为我的应用程序构建了一些Django-Rest-Framework API.这些API执行诸如模型实例的返回列表以及有多少模型满足预定标准的返回计数之类的操作.
这是我的ViewSet的样子:
class MyObjectsViewSet(viewsets.ViewSet):
def retrieve(self,request,pk=None):
queryset = ## Do something here to return a list of myObjects
serializer = MyObjectsSerializer(queryset) ## MyObjectsSerializer not shown here.
return Response(serializer.data,status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
这是我的urls.py对于这个端点的样子:
router = routers.DefaultRouter()
router.register(r'myObjects', views.myObjectsViewSet, base_name="myObjects")
urlpatterns = patterns('',
...
url(r'^api/', include(router.urls)),
...
)
Run Code Online (Sandbox Code Playgroud)
上面的代码允许我将一个参数带到API并将其用作MyObjectsViewSet.retrieve()中的pk参数.因此,当我将浏览器指向/ api/MyObjects/60 /时,使用pk == 60调用retrieve().很棒.一切都很棒.
但现在我需要一个可以做更多事情的API.我需要一个带有两个数字参数("pk"和"otherArg")的API,并使用这两个参数调用另一个viewSet(MyObjectsNewView).因此,当我将浏览器指向/ api/MyObjects/60/59 /时,将使用参数pk == 60和otherArg == 59调用MyObjectsNewView.retrieve().
如何在url.py和我的Viewsets中设计我的路线以使其工作?
在其他情况下,当我设计非REST URL时,我使用了regexp并使用这样的符号来从URL字符串中指定提取参数:(?P<MyObjectID>\d+).
看起来我应该能够在这里做同样的事情.但是,它会自动接收pk参数而不在路由中的任何位置指定它,所以现在我很困惑如何在第一个pk参数sorta神奇地出现而没有任何正则表达式模式时如何向此路由添加另一个参数.
这是我简单的HTML:
<body>
<div id="myParentDivElement">
Hello World!
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
这是随附的JavaScript:
$(document).ready(function() {
var myDOMElement = document.getElementById("myParentDivElement");
var newDivID = "div_1";
var newDiv = $('<div id="' + newDivID + '"/>');
$( newDiv ).css('marginLeft', '50px');
var newSpanID = "span_1";
var newSpan = $('<span id="' + newSpanID + '"/>');
newSpan.text('myLabel');
newDiv.appendChild(newSpan);
$( myDOMElement ).appendChild(newDiv);
});
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,该行newDiv.appendChild(newSpan);会出现以下错误:
Uncaught TypeError: undefined is not a function
Run Code Online (Sandbox Code Playgroud)
有人可以解释原因吗?这是JSFiddle显示它不起作用:http://jsfiddle.net/TsTMx/2/
我已经构建了一个Django API,当通过POST给出一个电子邮件地址时,将使用一个布尔值来响应,表明我的数据库中已存在该电子邮件地址的天气:
class isEmailTaken(views.APIView):
permission_classes = [permissions.AllowAny,]
def post(self, request, *args, **kwargs):
try:
email = request.DATA['email']
except KeyError:
return HttpResponse(
'An email was not given with this request.',
status=status.HTTP_400_BAD_REQUEST,
)
return HttpResponse(
json.dumps(
User.objects.filter(email=email),
content_type="application/json",
status=status.HTTP_200_OK,
)
)
Run Code Online (Sandbox Code Playgroud)
现在我想使用django-rest-swagger包自动生成此API的文档.我安装了软件包并在三引号之间插入了您在上面看到的注释.当我查看django-rest-swagger为此API生成的文档时,我会看到下面的图片.

但是,当我单击Try it out!按钮时,我收到如下所示的错误.值得注意的是,它从未让我有机会输入它应该通过POST发送的电子邮件参数.

为什么Django-Swagger-Package不创建允许我通过POST正确地使用"email"参数的文档?我该如何工作?
我有一个Django Web应用程序,它使用默认的自动递增正整数作为主键.此密钥在整个应用程序中使用,并经常插入到URL中.我不想向公众公开这个号码,以便他们可以猜测我的数据库中的用户或其他实体的数量.
这是一个经常要求,我已经向类似的矿山看到了问题和答案.大多数解决方案建议散列原始主键值.但是,这些答案都不符合我的需要.这些是我的要求:
实现这一目标的最佳方法是什么?以下工作会怎样?
def hash_function(int):
return fancy-hash-function # What function should I use??
def obfuscate_pk(sender, instance, created, **kwargs):
if created:
logger.info("MyClass #%s, created with created=%s: %s" % (instance.pk, created, instance))
instance.pk = hash_function(instance.pk)
instance.save()
logger.info("\tNew Pk=%s" % instance.pk)
class MyClass(models.Model):
blahblah = models.CharField(max_length=50, null=False, blank=False,)
post_save.connect(obfuscate_pk, sender=MyClass)
Run Code Online (Sandbox Code Playgroud) 我的Django应用程序的站点范围urls.py文件如下所示:
urlpatterns = patterns('',
url(r'^$', include('myApp.urls')),
url(r'^admin/', include(admin.site.urls)),
url (
r'^accounts/register/$',
RegistrationView.as_view(form_class=extendedRegistrationForm),
),
url(r'^accounts/', include('registration.backends.default.urls')),
url(r'^', include('myApp.urls')),
)
Run Code Online (Sandbox Code Playgroud)
我也有一个特定于myApp的urls.py,但我没有在这里显示,因为我认为它不相关.
在我的模板文件中,我有这个:
{% url logout %}
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误:
'url' requires a non-empty first argument. The syntax changed in Django 1.5, see the docs.
Run Code Online (Sandbox Code Playgroud)
当我将模板更改为:
{% url 'logout' %}
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
Reverse for 'logout' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
Run Code Online (Sandbox Code Playgroud)
如何在我的视图中添加注销链接?
这是我的Django类:
class MyClass(models.Model):
my_integer = models.IntegerField()
created_ts = models.DateTimeField(default=datetime.utcnow, editable=False)
Run Code Online (Sandbox Code Playgroud)
我想检索MyClass具有最新版本的实例created_ts每个唯一值my_integer.我无法弄清楚该怎么做.
有人可以告诉我该怎么做吗?
我使用Django Rest Framework创建了一个Django REST API .
我使用3个不同的客户来点击这个应用程序:
我有一个令人困惑的问题,即API返回的数据被Swagger和Angular损坏,而不是被Curl破坏.
我的Django模型看起来像这样:
class MyModel1(CachingMixin, models.Model):
id = models.BigIntegerField(default=make_id, primary_key=True)
name = models.CharField(max_length=50, null=False, blank=False,)
Run Code Online (Sandbox Code Playgroud)
这里make_id()描述了上面引用的方法.我最近从标准的Django分配和自动递增的主键实现了这一变化.作为改变的一部分,我将id从IntegerFielda 转换为a BigIntegerField.
我有一些其他Django视图代码(我在这里没有显示)创建一个名为的端点GetMyModel1ByName.该端点返回一个序列化的实例MyModel1.这是卷曲,显示当我点击该端点时会发生什么.它完美地运作:
$ curl http://localhost:4212/api/getMyModel1ByName/?name=my-name
{"id": 10150133855458395, "name": "my-name"}
Run Code Online (Sandbox Code Playgroud)
现在,当我从Chrome的开发者控制台访问同一个端点时会发生什么:
> $http = angular.element(document.body).injector().get('$http');
> $http.get("http://localhost:4212/api/getMyModel1ByName/?name=my-name").then(function(response) { console.log(JSON.stringify(response.data)) }).catch(function (error) { console.log(error.data) });
{"id":10150133855458396, "name":"my-name"}
Run Code Online (Sandbox Code Playgroud)
正如您所见,curl将ID报告为10150133855458395.这是正确的.这就是数据库中的内容.但Angular将其报告为1015013385545839 6.最后的数字是错误的.差异是1.这是非常令人惊讶的!
这是一个真正令人困惑的错误.我的Django代码非常简单,我非常有信心它没有错误.相反,我觉得这个改变id从外地IntegerField到BigIntegerField可能导致此问题.为什么会这样,解决方案是什么?它破坏了我的应用程序的功能.当我通过Swagger点击此端点时,我看到同样的损坏.
编辑:另一个提问者遇到了同样的问题.很高兴知道我不是唯一一个!但是,这个问题的答案并不是真正的答案.他们没有解释原因.他们没有告诉我如何在Angular JS代码中解决问题.
我有一个使用http-server提供的AngularJS应用程序
我希望我的元标签(og:title,og:description,og:image)动态地填充了的Facebook和其他刮削器(如时差)发布社交媒体网站上丰富的链接.但是,它很棘手,因为那些刮刀在角度动态插入适当的值之前对原始HTML页面进行刮擦.所以刮刀看到占位符值.
这里描述了该问题的一种解决方案.基本上:使用og已填充的所需字段提供scraper-bots静态HTML .我想这样做.但与那位作者不同,我没有使用apache.在http-server有,我所知道of.m没有.htaccess文件
我使用UI-Router并$state-provider处理提供给我的应用程序的URL,如下所示:
$stateProvider.state('splash',
{
url: '/',
templateUrl: 'html/splash.html',
controller: 'SplashCtrl',
data: {
meta: {
'title': 'My Title',
'description': 'My Description'
}
}
}
);
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以创建一个状态,以便刮刀机器人将被发送到与使用网络浏览器的普通人类用户不同的控制器?怎么样?
我有一个名为的AWS S3存储桶 static.mysite.com
该存储桶包含一个名为 html
我想使用AWS Command Line Interface删除目录的所有内容html,但不删除目录本身。我该怎么做?
此命令也删除目录:
aws s3 rm s3://static.mysite.com/html/ --recursive
Run Code Online (Sandbox Code Playgroud)
我没有在AWS S3 rm的手册条目中看到此问题的答案。