2014-01-10 37 views
0

我想从桌面ERP发送一些数据库信息到django web服务器,作为web界面。 我尝试过的第一件作品是使用请求模块来“伪装”一个带有附加文件的POST。 但是,这是一个明显肮脏(但有效)的方式来做到这一点。 我通过会话使用身份验证。 有没有一个干净的(呃)方法来做到这一点?用桌面程序数据喂django web服务器

我的代码:

headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
      'Accept-Encoding': 'gzip, deflate', 
      'Accept-Language': 'en-US,en;q=0.5', 
      'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0', 
      'Referer': 'https://auth.afip.gov.ar/contribuyente/', 
      'Connection': 'keep-alive', 
      } 


session = requests.Session() 

response = session.get('http://192.168.0.101:8000/sincronizacion/', headers=headers) 

soup = BeautifulSoup(response.text) 

csrf_value = soup.find(attrs={'name': 'csrfmiddlewaretoken', })['value'] 

login_info = {'username': 'user', 'password': 'pass', 'csrfmiddlewaretoken': csrf_value, 
       'next': '/sincronizacion/', } 

response = session.post('http://192.168.0.101:8000/login/?next=/sincronizacion/', data=login_info, headers=headers) 

soup = BeautifulSoup(response.text) 

csrf_value = soup.find(attrs={'name': 'csrfmiddlewaretoken', })['value'] 

datos_odontologos = {'test': 'test', 'csrfmiddlewaretoken': csrf_value} # test represents a future csv attachment 

response = session.post('http://192.168.0.101:8000/sincronizacion/', data=datos_odontologos) 

print(response.status_code) 
+0

这是正确的。但我认为你不必自己处理cookie。请求'会话管理自己的cookiejar – gawel

+0

@gawel我试图从发布数据中删除csrfmiddleware并得到了403错误..也许我们需要发布帖子和cookie数据? – Alvaro

+0

对。抱歉。您可以从cookie中检索令牌,但至少要提供http标头,而不是cookie https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax – gawel

回答

1

最好的办法是使用Django在发送的CSRF cookie,并发送回通过HTTP头,当你发布的一些数据:

>>> session = requests.Session() 
>>> # get the cookie 
>>> resp = session.get(url) 
>>> # post data with csrf header using the cookie value 
>>> resp = session.post(url, data=data, headers={"X-CSRFToken": resp.cookies['csrftoken']) 

这你不必解析html结果来获得csrf标记或修改发送的数据。

+0

非常棒!我会添加它保存我从使用bs4 – Alvaro

相关问题