Python

django 跨域访问 json数据

跨域访问api,获取json 格式数据;需要将对json 数据的请求转换为jsonp的请求;

前端

function ajaxServiceGetJsonP(url, completeFunc) {
    var resp;

    var jqXhr = jQuery.ajax ({
        url: url,
        type: 'GET',
        dataType: 'jsonp', // 数据类型
        jsonp: "callback",  //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
        success: function(data, textStatus, xhr){
            resp = data;
        },
        error: function(jqXHR, textStatus, errorThrown) {
        }
    }).complete(function() {
        completeFunc(resp)
    });

    return jqXhr;
}

使用 $.getJSON(url,[data],[callback]) 方法也是支持jsonp: 可以使用$.getJSON(url,[data],[callback])方法(详细可以参考http://api.jquery.com/jQuery.getJSON/)。改用jQuery的getJSON方法来实现(下面的例子没用用到向服务传参,所以只写了getJSON(url,[callback]))

<script type="text/javascript">
    $.getJSON("http://localhost:20002/MyService.ashx?callback=?",function(data){
        alert(data.name + " is a a" + data.sex);
    });
</script>

后端

之前为json格式的返回:

return HttpResponse(jsonp_format(callback, response), content_type='application/json')

修改为jsonp:

callback = request.GET.get('callback')
json_format = "%s(%s);" % (callback, json.dumps(response))
return HttpResponse(json_format, content_type='application/json')

完成跨域请求;

extra: url解析支持跨域的解析

使用django的template编写的页面逻辑中,需要访问的动态url,地址通过url revert规则生成:

<a href="{ url 'caching:update_instance' instance.id }">更新信息</a>

通过url revert 解析的都是本域名内的地址; 如何针对不同场景解析出不同域名? 使用templatetags;

定义slave_urls.py

from django import template
from django.conf import settings

register = template.Library()

SLAVE_DOMAIN = '' if settings.DEBUG else 'http://slave.cache.demo.org'

SLAVE_URLS = {
    'manage:control': '/manage/control/',
    'metrics:info': '/api/metrics/{0}/',
}

@register.simple_tag
def slave_url(shortcut, *args):
    if shortcut not in SLAVE_URLS:
        raise Exception('Cannot found valid url for shortcut: ' + shortcut)
    return SLAVE_DOMAIN + SLAVE_URLS[shortcut].format(*args)

该文件放到任何一个module app下的 templatetags文件夹下就可被django 检查到;

前端模版页面

{ extends 'base.html' }
{ load staticfiles }
{ load slave_urls }
{ load extras }

# 调用
<a href="{ slave_url 'metrics:info' instance.id }">更新信息</a>

ref

json和jsonp http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

Search

    Post Directory