您现在的位置是:网站首页 > 分类 > 文章详情

drf前端调用聊一聊

T2018年9月29日 11:07195人围观
简介drf前端调用,我们可以用vue、nodejs、或则直接用django模板引擎

既然我们前文依照djangorestframework设计了一些接口,那么我们寻思下前端怎么去调用,目前由于vue、nodejs这些学习成本还是有点高的,我们可以后期来学,暂且使用比较简单的django模板引擎

其实主要的也就一个urllib的使用,定义一个公共的请求方法(get/post)

def getdata(url, data=None):
    headers = {
        'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
        r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
        'Referer': r'',
        'Connection': 'keep-alive',
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*',
        }
    # data = {
    #     'first': 'true',
    #     'pn': 1,
    #     'kd': 'Python'
    #     }
    # urlencode()主要作用就是将url附上要提交的数据。
    # 经过urlencode()转换后的data数据为?first=true?pn=1?kd=Python,最后提交的url为
    # http://xxxxx/xx/xx?first=true?pn=1?kd=Python
    try:
        if data:
            # data = parse.urlencode(data).encode('utf8')
            # data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用 urllib.parse.urlencode() 编码。
            # data = bytes(parse.urlencode(data), encoding="utf8")
            data = '?'+parse.urlencode(data)
            # 使用request()来包装请求,再通过urlopen()获取页面。
            url = urljoin(url, data)
            req = request.Request(url=url, headers=headers, method='GET')
        else:
            req = request.Request(url=url, headers=headers)

        reponsedata = request.urlopen(req, timeout=10).read()
        reponsedata = reponsedata.decode('utf-8')
        returndata = json.loads(reponsedata)
    except Exception as e:
        print(e.code)
        returndata = {'result': e.reason, 'code': e.code(), 'msg': '请求api数据错误!', 'data': '{}', 'redirect_url': ''}
    return returndata

当然除了urllib.request,我们还可以用requests库,需要pip install一下,但是一般不建议使用requests库,该requests库直接使用不能异步调用,速度慢,下面也给个简单的例子,看上去是十分简洁的:

def message(text, mobile):
    text_info = {
        "msgtype": "text",
        "at": {
            "atMobiles": [
                mobile
            ],
            "isAtAll": False
        },
        "text": {
            "content": text
        }
    }
    print(requests.post(url, json.dumps(text_info), headers=headers).content)  # 将返回的数据编码JSON 字符串

最后,我们来看看怎么调用呢,如果是get就比较方便,直接category_list = getdata(category_url)。如果是post,也就多了一个请求时候需要带上的参数data,请看下面例子:

def search(request):
    strquery = request.GET.get('query')
    page = int(request.GET.get('page', 1))
    data = {
        "search": strquery,
        "page": page,
        "ordering": '-id',
    }
    article_data = getdata(articles_url, data)
    article_list = article_data["results"]
    # 总记录数
    count = article_data["count"]
    # 下一页
    next = article_data["next"]
    nextpage = page + 1
    # 上一页
    previous = article_data["previous"]
    previouspage = page - 1
    # 总页数
    num_pages = math.ceil(count / PAGESIZE)
    curr_url = request.get_full_path()
    nPos = curr_url.find('&page')
    if nPos > 0:
        curr_url = request.get_full_path()[0:nPos]
    else:
        curr_url = request.get_full_path()

    return render(request, 'searchlist.html', locals())


包括我们前端可能需要注册/登录,也就使用ajax去请求我们的登录接口,传递json格式的参数

over,就这样了

文章评论

阿里云-云大使推广
阿里云-云服务器推广

微信公众号