跳转到主要内容

Ajax请求马匹

项目描述

AJAX requests for Ponies™

你有多少次发现自己需要编写一些Django视图来处理AJAX请求?你又有多少次只是复制粘贴了一个同步请求的视图,并编辑它们以返回一个JSON对象?因此,你又有多少次忘记@login_required实际上会在匿名用户的情况下将请求重定向到登录页面?如果你遇到这种情况的次数和我们一样多,你可能会开始考虑使用django-ajaxutils。

Django-ajaxutils允许你定义一个视图作为AJAX视图,它将返回一个JSON对象,并且能够正确处理用户未认证和无效请求等错误。一切通过简单的装饰器!

https://secure.travis-ci.org/ahref/django-ajaxutils.png?branch=master

安装

只需

pip install django-ajaxutils

来完成魔法。

用法

如果你想定义一个处理AJAX请求的视图,你只需用@ajax装饰它,并返回一个代表要作为JSON返回的对象的字典。如果你缺乏想象力,请查看以下示例

from ajaxutils.decorators import ajax


@ajax()
def check_for_some_task(request):
    exit_status = get_status_of_some_task()
    if exit_status is None:
        return {
            'status': 'pending'
        }

    return {
        'status': 'completed',
        'exit_status': exit_status
    }

需要认证

如果你的视图需要用户认证,只需写

@ajax(login_required=True)
def some_very_private_view(request):
    data = perform_something_private()
    return {
        'data': data
    }

在不认证的请求的情况下,将返回一个包含以下JSON对象的401: Unauthorized响应

{
    'status': 'error',
    'error': 'Unauthorized',
}

需要GET / POST

@ajax还允许你快速要求视图的特定方法。例如,如果你的视图将编辑一些服务器端数据,你可能只接受POST请求。使用@ajax这就像记住π的前两个小数位数(顺便说一下,它们是1和4)一样简单

@ajax(login_required=True, require_POST=True)
def submit_my_data(request):
    new_obj = save_my_data()
    return {
        'id': new_obj.pk
    }

在不合法请求的情况下,这将返回一个包含以下JSON对象的405: Method not allowed响应

{
    'status': 'error',
    'error': 'Method not allowed',
}

当然,您可以为GET请求设置 require_GET=True

您还可以使用这种替代语法

@ajax(require="GET")
def my_cool_view(request):
    return {
        'hello': 'world!'
    }

自定义状态码

如果您不想返回HTTP 200,您想返回404吗?请编写

from django.http import Http404

@ajax()
def my_cool_view(request):
    raise Http404

这会返回

{
    'status': 'error',
    'error': 'Not found',
}

或者可能是400 - 错误请求

from django.http import HttpResponseBadRequest

@ajax()
def my_cool_view(request):
    return HttpResponseBadRequest('My error message')

这会返回

{
    'status': 'error',
    'error': 'My error message',
}

并且HTTP响应的状态码为400。

另一种语法,更符合Flask风格

@ajax()
def my_cool_view(request):
    return {
        "i'm a": 'teapot'
    }, 418

从infinity导入json

厌倦了编写无限导入语句来选择最佳的json模块?让ajaxutils为您完成

from ajaxutils import json

目前,ajaxutils更倾向于使用simplejson而不是stdlib json。没有使用其他json模块。未来我们可能会通过Django设置提供对ujson的支持。

变更日志

v0.2

  • 将JsonResponse移动到ajaxutils.http

  • 添加了自定义状态码处理

  • 添加了@ajax(require=METHOD)的文档

  • 添加了“from ajaxutils import json”

项目详情


下载文件

下载适合您平台文件的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。

源代码分布

django-ajaxutils-0.2.tar.gz (4.5 kB 查看哈希值)

上传时间 源代码

由以下支持