Django - 登录远程登录页面

时间:2014-09-11 03:42:33

标签: python django login

我想通过django
登录外部远程页面http://example.com/login 我的意思是使用django,向该站点发送用户名和密码,并在登录后获取页面的html文件(例如http://example.com/index),并做一些jQuery从tahat页面中提取一些想要的数据! 我搜索并发现(在php中卷曲确实以我想要的方式)但是我应该如何在django中做到这一点?

2 个答案:

答案 0 :(得分:2)

执行此类任务时需要考虑两个方面。首先,如果您控制了要与之通信的网站,其次,如果网站有API。您需要根据这些使用不同的库。

如果您要访问的网站具有API,您将能够直接从您的程序与其进行通信,即调用方法并以“机器友好”格式(如Json,XML等)获取结果。如果网站没有API,您需要模仿用户交互并解析HTML,对于这些情况,测试工具通常可以很好地完成此任务。

例如,如果您要访问的站点是本地Django站点,您可以使用Django测试工具中的the test client

>>> from django.test.client import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})
>>> response.status_code
200
>>> response = c.get('/customer/details/')
>>> response.content
'<!DOCTYPE html...'

一旦你做了这个电话,你就不会使用jQuery而是使用python。你通常会在response.content中找到答案,你可能需要解析它,假设你得到一个html。

如果您要访问的网站是第三方网站,我会使用requests library,您需要写下这样的内容:

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

如果您要访问的网站具有API并且您通过REST调用访问它,这将是更简单的,这是上面的请求库示例。根据您要访问的网站,您可能已经拥有一个Python库,它通常是这些API调用的包装器。

答案 1 :(得分:2)

经过大量的搜索,终于找到了2个解决方案:
1)使用这个惊人的流行 Django包
Django Requests Package 正如其documantation所说,我可以这样做:

import requests

r = requests.get('https://api.github.com', auth=('user', 'pass'))

print r.status_code
print r.headers['content-type']

# ------
# 200
# 'application/json'

2)第二个解决方案是使用Python URL Libray

import urllib2

gh_url = 'https://api.github.com'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.getcode()
print handler.headers.getheader('content-type')

# ------
# 200
# 'application/json'