如何进行需要在web2py登录的api调用?

时间:2015-11-26 11:55:36

标签: python api urllib2 web2py urllib

我想从应用程序访问API。这些API有装饰器@auth.requires_login()

我正在使用

从控制器调用api

demo_app /控制器/ plugin_task /任务

url = request.env.http_origin + URL('api', 'bind_task')
page = urllib2.Request(url)
page.add_header('cookie', request.env.http_cookie)
response = urllib2.urlopen(page)

演示API

api.py

@auth.requires_login()
@request.restful()
def bind_task():
    response.view = 'generic.json'
    return dict(GET=_bind_task)


def _bind_task(**get_params):
    return json.dumps({'status': '200'})

上面的代码给出了错误:HTTPError: HTTP Error 401: UNAUTHORIZED 如何解决这个问题?我需要添加任何其他标题吗?

目录结构 -

Demo_app
|
|-controllers
   |
   |-api.py 
   |-plugin_task.py

控制器plugin_task.py调用bind_task()

中的api.py

修改

应用.w2p文件 - Download

1 个答案:

答案 0 :(得分:0)

看来 this 是在 Web2py 中指定 REST API 端点的正确方法:

auth.settings.allow_basic_login = True
@auth.requires_login()
@request.restful()
def api():
    response.view = 'generic.json'

    def GET(tablename, id):
        if not tablename == 'person':
            raise HTTP(400)
        return dict(person = db.person(id))

    def POST(tablename, **fields):
        if not tablename == 'person':
            raise HTTP(400)
        return db.person.validate_and_insert(**fields)

    return locals()

根据this answer@auth.requires_login() 装饰器使用 HTTPBasicAuth,即 python -m pip install requests 之后的 easy to use

import requests


requests.get('http://127.0.0.1:8000/myapp/default/api/person/1.json', auth=('user', 'pass'))