django-piston创建web services

描述

写道
经过一天的资料查看及测试,已经可以成功的在jiayou3中调用icgoo的数据....
我这里的测试是通过get方式向接口传递几个参数后返回型号在icgoo的实时报价数据...

 

准备工作

写道
项目 jiayou3 + v45

1.下载django-piston,并将该app放到项目的根目录下;
2.在项目根目录下新建一个名字为API的app,我在里面创建了五个文件;
2.1 : __init__.py 空
2.2 : handlers.py 用来存放接口的定义
2.3 : urls.py 用来存放接口的url
2.4 : authentication.py 用来存放权限校验类,我是从piston里copy过来的,在其中加了一个自定义校验
2.5 : my_pycurl.py 是一个封装了curl操作的方法,供调用接口里使用
3.在根urls加入 url(r'^api/', include('API.urls', namespace='django-piston')),

## 因为这次做接口不是单纯的发送或单纯的接收,所以上面3步,我分别在jiayou3与v45各做了一份;其中v45使用了handler.py,urls.py,authentication.py三个文件,而jiayou3使用了my_pycurl.py文件

 

从url开始

每一个接口都是一个url,它对应着get,post,put,delete各种操作,各不侵犯,严格遵守;

#v45->API->urls.py
#coding=utf-8

from django.conf.urls.defaults import *
from piston.resource import Resource

from authentication import CustomAuthentication , HttpBasicAuthentication
from handlers import DataFromIcgooHandler

#提示信息'jiayou3',这个basic验证会调用系统的auth来进行匹配,成功即通过;
_auth = CustomAuthentication(realm='jiayou3')
_AUTHENTICATORS = [_auth]

datafromicgoo_handler = Resource(DataFromIcgooHandler,authentication=_AUTHENTICATORS)

urlpatterns = patterns('',
   url(r'^data_from_icgoo/', datafromicgoo_handler, { 'emitter_format': 'json' }),
)

## 解释一下
## 接口url就是  '/api/data_from_icgoo/';
## 在handlers 里定义了一下 DataFromIcgooHandler类,用来驱动这个接口,下面会讲到;
## 同时要调用这个接口还需要通过验证,authentication=_AUTHENTICATORS , 必须是我定义的用户名及密码才可以通过;
## CustomAuthentication就是我自定义的一个验证方法
## 'emitter_format': 'json' 表示返回的数据是json,你还可以自定义为yaml,xml等

 

 

hanlder开始工作

# v45->API->handlers.py

#coding=utf-8

from piston.handler import BaseHandler
from ajax_show_stock.jiayou import JiayouInterface


class DataFromIcgooHandler(BaseHandler):
    allowed_methods = ('GET',)

    def read(self, request):
        '''
            根据参数返回icgoo的实时数据
        '''
        if request.method == 'GET':
            data = request.GET
        else:
            data = request.POST
        
        partno = data.get('partno','')
        quantity = data.get('quantity',1)
        try:
            quantity = int(quantity)
        except Exception,e:
            quantity = 1
        supplier = data.get('supplier','999')
        
        real = data.get('real','0')#'1'为去官网找原始数据(主要是我们没有,mouser等官网有的)
        if real == '0':
            real = False
        else:
            real = True
        
        test = JiayouInterface(partno,quantity)
        
        if supplier == '999':
            supplier = None
            
        if not real:
            results = test.getAllPriceToJiayou(supplier,True)
        else:
            results = test.getRealTimeToJiayou(supplier)
   
        return results

# allowed_methods = ('GET',) 表示个接口只允许get操作,如果你还需要别的操作自行添加,如 allowed_methods = ('GET','POST','DELETE',)
# GET操作会自动去寻找read函数,同理POST等也有其对应的函数名;
# 获取参数后就就可以开始一系列的动作了,然后将值返回即可,返回的是一个json字符串,到时候你可以用json.loads(results)进行结构还原;

 

 

看到这里是不是很简单,不错,此时这个接口已经定义好了,就等着别人来使用它们了.......

 

使用接口

jiayou3 -> sale -> views.py

## 在需要使用该接口的地方类似以下调用即可;

    if request.method == 'GET':
        paras = request.GET
    else:
        paras = request.POST

    url = 'http://localhost:8000/api/data_from_icgoo/?' + urllib.urlencode(paras)    
    data = request_curl(url,'GET')

##  request_curl 就是 my_pycurl.py里的一个方法,它用来接用接口
##  data 就对应着我们上面 handlers里的返回的 results

 

 

my_pycurl.py

import pycurl
import StringIO
import urllib

USERNAME = 'admin'
PASSWD = 'admin'

HOST = 'http://localhost:8000'

def request_curl(url, request_method='GET', **data):
    url = url.encode('utf-8', 'ignore')

    curl = pycurl.Curl()
    res = StringIO.StringIO()
    
    curl.setopt(pycurl.URL, url)
    curl.setopt(pycurl.WRITEFUNCTION, res.write)
    #curl.setopt(pycurl.FOLLOWLOCATION,1)
    curl.setopt(pycurl.USERPWD, '%s:%s' % (USERNAME, PASSWD))
    
    if request_method == 'POST':
        curl.setopt(pycurl.POSTFIELDS, urllib.urlencode(data))
    elif request_method == 'PUT':
        curl.setopt(pycurl.PUT, 1)
    elif request_method == 'DELETE':
        curl.setopt(pycurl.CUSTOMREQUEST, 'delete')
    else:
        curl.setopt(pycurl.HTTPGET, 1)
        
    #This will tell libcurl not to use any signal related code that causes in a multithreaded python script this kind of error. 
    curl.setopt(pycurl.NOSIGNAL, 1)
    
    curl.setopt(pycurl.MAXREDIRS,5)
    #-----------
    curl.setopt(pycurl.CONNECTTIMEOUT,30)
    curl.setopt(pycurl.TIMEOUT,60)
    #------
    #curl.setopt(pycurl.USERAGENT,'Mozilla/5.0(Windows;U;Windows NT 5.1;zh-CN;rv:1.9.2.9)Gecko/20100824 Firefox/3.6.9')    
    
    curl.perform()
    #print type(res.getvalue())
    return res.getvalue()

 

你可能感兴趣的:(web services)