使用django管理风格注册为模型提供与backbone.js兼容的rest api。

django-backbone的Python项目详细描述


概述

此应用程序为您的模型提供了与backbone.js兼容的rest api。它遵循扩展、重写和注册的django管理模式;并为定制提供了一个可扩展的基于类的视图。

这样,您就可以拥有快速、开箱即用的功能,也可以重写任何方法或变量来定制您喜欢的东西。

例如:

# fooapp/backbone_api.py
import backbone
from fooapp.models import Foo

class FooAPIView(backbone.views.BackboneAPIView):
    model = Foo
    display_fields = ('title', 'description')
    ordering = ('creation_date', 'id')

backbone.site.register(FooAPIView)

更高级的定制可以通过钩住继承类上的方法来实现——继承类本身就是一个基于类的视图。例如:

...

class FooAPIView(backbone.views.BackboneAPIView):
    model = Foo
    display_fields = ('title', 'description',)
    ordering = ('creation_date', 'id')

    def post(self, request):
        return HttpResponseForbidden('No adding allowed!')

    def queryset(self, request):
        # Only return "active" objects
        return Foo.objects.filter(is_active=True).order_by('-id')

    def has_delete_permission(request, obj):
        return request.user.is_staff  # Only staff can delete objects
...

功能

  • 自动为您的模型生成json rest api,该api与backbone.js很好地配合使用。
  • 基于基于类的视图和模型表单的api,允许细粒度定制和扩展。
  • 可自定义的权限限制。默认情况下,它使用django.contrib.auth身份验证和权限(类似于django admin)。

用法

  1. 在app文件夹中创建一个backbone_api.py文件,并通过子类化backbone.views.BackboneAPIView注册api定义。
    # fooapp/backbone_api.py
    import backbone
    from fooapp.models import Foo
    
    class FooAPIView(backbone.views.BackboneAPIView):
        model = Foo
        display_fields = ('title', 'description')
        ordering = ('creation_date', 'id')
    
    backbone.site.register(FooAPIView)
    
    See section on 'BackboneAPIView Options' for a full list of options available.
    
  2. 在javascript集合/模型定义中,将url/urlRoot设置为指向django-backboneapi:
    // Assuming you have a Backbone model called 'Foo' and a collection 'FooCollection'
    Foo.prototype.urlRoot = "{% url 'backbone:fooapp_foo' %}";
    FooCollection.prototype.url = "{% url 'backbone:fooapp_foo' %}";
    
    See section on 'URL reversing' below for details on the url naming.
    
  3. (可选)如果启用了CSRF保护,则需要修改backbone.sync命令以发送CSRF令牌:
    <script>
        // (Optional) Do this if you are using csrf protection:
        // See: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
        var oldSync = Backbone.sync;
        Backbone.sync = function(method, model, options) {
            options.beforeSend = function(xhr){
                xhr.setRequestHeader('X-CSRFToken', '{{ csrf_token }}');
            };
            return oldSync(method, model, options);
        };
    </script>
    
  4. 就这样。现在您应该能够在主干集合和模型上执行fetch()save()等操作。

权限

默认情况下,django-backbone阻止添加、更新或删除请求,除非用户已登录并分别具有can_addcan_changecan_delete权限。这遵循django管理中使用的权限,但有一个例外-允许在所有注册的模型上公开读取

这可以通过重写适当的权限挂钩来更改(请参阅“BackboneAPIViewoptions”部分)。

BackboneAPIView选项

请检查类backbone.views.BackboneAPIView的源代码以获取钩子的完整列表。这些方法由它们的docstring记录。

以下是一些您可以自定义的基本选项:

  • model:用于此api定义的模型
  • display_fields:要为读取(get)请求返回的字段,
  • fields:添加(post)或编辑(put)对象时允许的字段。
  • form:用于添加或编辑对象的窗体类。
  • ordering:检索集合时使用的排序
  • paginate_by:每页最大对象数(允许使用pageget参数)。

反转api url

以下命名的URL模式适用于所有已注册的型号:

  • 集合URL:^{TT23}$(返回到^{TT24}$)
  • 模型URL:^{TT25}$(返回到^{TT26}$)

您可以通过在BackboneView类上指定url_slug属性来更改url(和url名称)中的<model_name>(只需确保它不会与其他视图冲突)。

安装

注意:django-backbone需要django 1.3或更高版本。

  1. backbone添加到设置文件中的INSTALLED_APPS

  2. 钩住url并调用backbone.autodiscover()(它将在您的应用程序中找到所有backbone_api.py文件):
    # urls.py
    
    import backbone
    backbone.autodiscover()
    
    urlpatterns += patterns('',
        (r'^backbone/', include(backbone.site.urls)),
    )
    

运行测试

# For Django 1.6+
./manage.py test backbone.tests --settings=backbone.tests.settings

# For Django < 1.6
./manage.py test tests --settings=backbone.tests.settings

替代品/灵感

这个应用程序借鉴了其他开源django/backbone集成应用程序的概念和模式。值得一看,因为它们可能更适合您的用例:

许可证

此应用程序是根据BSD许可证授权的。有关详细信息,请参见许可文件。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Kafka DSL Kstream>Ktable连接序列化编译错误   java为什么Bean A中的参数注入会破坏属性解析Bean B?(都是类型PropertyPlaceHolderConfigure的类型)   java Oracle SQL开发人员在尝试导出数据时调用TargetException   编辑JTree中返回的java意外值   Java,Lambda:如何从不同类型的列表集合中查找列表?   如何使用java执行命令   java如何将drawable分配给widgets按钮   JavaIntelliJ13JSF对Springbeans的支持   java转换。转换成补语   java Tomcat的性能测试   sendmail Java发送邮件函数   java重用ProjectReactor/Flux/Mono被认为是最佳实践吗?   javafx在Java中错误地转换为lambda表达式   反序列化json数组,其中属性值为数组java   java After ItemClickListener调用方法   此Java代码中有多少对象符合垃圾收集条件?   java程序“keytool”可以在以下包中找到