Python(Django)中无需本地存储实现Google AdWords API认证求助
解决方案
其实googleads库的AdWordsClient完全支持手动传入凭证参数,不需要局限于LoadFromStorage()从本地文件读取,正好适配你这种多管理员凭证存在数据库的场景,我来给你具体讲下实现步骤:
1. 先定义Django模型存储凭证
首先你需要在Django里建一个模型来保存每个AdWords管理员的凭证信息,比如:
from django.db import models class AdWordsAccount(models.Model): admin_name = models.CharField(max_length=100, unique=True) client_id = models.CharField(max_length=200) client_secret = models.CharField(max_length=200) refresh_token = models.CharField(max_length=200) developer_token = models.CharField(max_length=100) client_customer_id = models.CharField(max_length=50) # 格式需为 123-456-7890 def __str__(self): return self.admin_name
把每个管理员的对应凭证存入这个模型即可。
2. 手动初始化AdWordsClient
当需要对接AdWords API时,从数据库取出对应管理员的凭证,然后直接传入AdWordsClient的构造方法,替代LoadFromStorage():
from googleads import adwords # 假设你要获取某个管理员的凭证,比如根据admin_name查询 account = AdWordsAccount.objects.get(admin_name="张三") # 手动构建客户端 client = adwords.AdWordsClient( developer_token=account.developer_token, oauth2_client_id=account.client_id, oauth2_client_secret=account.client_secret, oauth2_refresh_token=account.refresh_token, client_customer_id=account.client_customer_id ) # 接下来就可以正常使用client调用API了,比如获取广告系列示例 campaign_service = client.GetService('CampaignService', version='v201809') selector = {'fields': ['Id', 'Name']} results = campaign_service.get(selector)
3. 注意事项
- 确保你的
developer_token是有效的,并且已经和对应的AdWords账号关联 client_customer_id必须严格按照XXX-XXX-XXXX的格式填写,不能省略分隔符- 如果遇到OAuth2相关的错误,可以检查refresh_token是否过期,或者client_id/client_secret是否匹配
- 可以把初始化client的逻辑封装成一个Django工具函数,方便在各个视图或任务中调用
这样你就能轻松支持多个AdWords管理员的凭证管理,完全不需要依赖本地的存储文件啦!
内容的提问来源于stack exchange,提问作者Bryant Makes Programs




