Django 学习

我的应用很简单。我只需要读取指定日期的收益金额,并保存到我的本地数据库。

我在djaongo项目中创建了一个新的应用,叫做“adsense”。并创建了一个models.py文件来存储认证证书。

 

[python] view plain copy
  1. from django.contrib.auth.models import User  
  2. from django.db import models  
  3. from oauth2client.django_orm import CredentialsField  
  4.   
  5. class Credential(models.Model):  
  6.     id = models.ForeignKey(User, primary_key=True)  
  7.     credential = CredentialsField()  
  8.   
  9. class Revenue(models.Model):  
  10.     date = models.DateField(unique=True)  
  11.     revenue = models.DecimalField(max_digits=7, decimal_places=2)  
  12.   
  13.     def __unicode__(self):  
  14.         return '{0} ${1}'.format(self.date, self.revenue)  

 

我把从API控制台下载的JSON文件放到我的应用的文件夹下面,并创建了一个views.py文件:

[python] view plain copy
  1. import os  
  2.   
  3. from django.conf import settings  
  4. from django.contrib.auth.decorators import login_required  
  5. from django.contrib.sites.models import Site  
  6. from django.http import HttpResponseBadRequest, HttpResponse  
  7. from django.http import HttpResponseRedirect  
  8. from oauth2client import xsrfutil  
  9. from oauth2client.client import flow_from_clientsecrets  
  10. from oauth2client.django_orm import Storage  
  11.   
  12. from .models import Credential  
  13.   
  14. CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')  
  15.   
  16. FLOW = flow_from_clientsecrets(  
  17.     CLIENT_SECRETS,  
  18.     scope='https://www.googleapis.com/auth/adsense.readonly',  
  19.     redirect_uri='http://{0}/adsense/oauth2callback/'.format(  
  20.         Site.objects.get_current().domain))  
  21.  
  22. @login_required  
  23. def index(request):  
  24.     storage = Storage(Credential, 'id', request.user, 'credential')  
  25.     credential = storage.get()  
  26.     if credential is None or credential.invalid is True:  
  27.         FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY,  
  28.                                                        request.user)  
  29.         authorize_url = FLOW.step1_get_authorize_url()  
  30.         return HttpResponseRedirect(authorize_url)  
  31.     else:  
  32.         return HttpResponse('Already validated.')  
  33.  
  34. @login_required  
  35. def auth_return(request):  
  36.     if not xsrfutil.validate_token(settings.SECRET_KEY,  
  37.                                    request.REQUEST['state'], request.user):  
  38.         return  HttpResponseBadRequest()  
  39.     credential = FLOW.step2_exchange(request.REQUEST)  
  40.     storage = Storage(Credential, 'id', request.user, 'credential')  
  41.     storage.put(credential)  
  42.     return HttpResponseRedirect("/")  


在 urls.py 文件中我包含了一个链接指向我的应用的url文件

main urls.py:

[python] view plain copy
  1. from django.conf.urls import patterns, include, url  
  2. from django.contrib import admin  
  3.   
  4. admin.autodiscover()  
  5.   
  6. urlpatterns = patterns(  
  7.     '',  
  8.     url(r'^adsense/', include('adsense.urls', namespace='adsense')),  
  9.   
  10.     url(r'^admin/doc/', include('django.contrib.admindocs.urls')),  
  11.     url(r'^admin/', include(admin.site.urls)),  
  12. )  


adsense/urls.py:

[python] view plain copy
  1. from django.conf.urls import patterns, url  
  2.   
  3. urlpatterns = patterns(  
  4.     'adsense.views',  
  5.     url(r'^$''index', name='index'),  
  6.     url(r'^oauth2callback/$''auth_return', name='auth_return'),  
  7. )  


最后,创建了一个通过给定日期调用API并获取收益的类。它放在adsense/tasks.py,因为我准备把它当作任务,钩在  Celery/  RabbitMQ之上。

[python] view plain copy
  1. import datetime  
  2. import httplib2  
  3.   
  4. from apiclient.discovery import build  
  5. from django.contrib.auth.models import User  
  6. from oauth2client.django_orm import Storage  
  7.   
  8. from .models import Credential, Revenue  
  9.   
  10. TODAY = datetime.date.today()  
  11. YESTERDAY = TODAY - datetime.timedelta(days=1)  
  12.   
  13. class Scraper(object):  
  14.     def get_report(self, start_date=YESTERDAY, end_date=TODAY):  
  15.         user = User.objects.get(pk=1)  
  16.         storage = Storage(Credential, 'id', user, 'credential')  
  17.         credential = storage.get()  
  18.         if not credential is None or credential.invalid is False:  
  19.             http = httplib2.Http()  
  20.             http = credential.authorize(http)  
  21.             service = build('adsense''v1.2', http=http)  
  22.             reports = service.reports()  
  23.             report = reports.generate(  
  24.                 startDate=start_date.strftime('%Y-%m-%d'),  
  25.                 endDate=end_date.strftime('%Y-%m-%d'),  
  26.                 dimension='DATE',  
  27.                 metric='EARNINGS',  
  28.             )  
  29.             data = report.execute()  
  30.             for row in data['rows']:  
  31.                 date = row[0]  
  32.                 revenue = row[1]  
  33.   
  34.                 record = Revenue()  
  35.                 try:  
  36.                     r = Revenue.objects.get(date=date)  
  37.                     pk = r.id  
  38.                 except Revenue.DoesNotExist:  
  39.                     pk = None  
  40.                 record.id = pk  
  41.                 record.date = date  
  42.                 record.revenue = revenue  
  43.                 record.save()  


为了让它能工作起来,我在浏览器打开http://localhost:8000/adsense/。这时候会要求我登录Google帐号。我为我的应用授权来访问Adsense。然后,认证证书就会保存在我的本地数据库,然后我可以调用Scraper get_report() 方法。祝贺我吧!。它能顺利工作了。

你可能感兴趣的:(Django 学习)