簡體   English   中英

int()參數必須是字符串或數字,而不是'SimpleLazyObject'

[英]int() argument must be a string or a number, not 'SimpleLazyObject'

我正在通過Aliexpress API開發Web應用程序。

但是我遇到了一些問題,例如我的頭銜。

我寫我的觀點如下:

def getToken(request):
appKey = 'test12345'
appSecret ='test3456'
redirectUrl = 'http://127.0.0.1:8000/'
#post to submit the request
postdata=urllib.urlencode({
    'grant_type':'authorization_code',
    'need_refresh_token':True,
    'client_id':appKey,
    'client_secret':appSecret,
    'redirect_uri':redirectUrl,
    'code':request.GET['code'],
    })
req = urllib2.Request(
    url = 'https://gw.api.alibaba.com/openapi/http/1/system.oauth2/getToken/%s' % appKey ,
    data = postdata)
#get access_token
value = eval(urllib2.urlopen(req).read())

#Checking the shop
check = aliexpressToken.objects.filter(user=request.user, aliid=value['aliId'])
if check:
    return HttpResponseRedirect("/shop/")
else:        
    result = aliexpressToken(user=request.user, aliid=value['aliId'], resource_owner=value['resource_owner'], refresh_token=value['refresh_token'], access_token=value['access_token'],shop_name='Aliexpress Trade')
    result.save()
    #get the id of shop which just is added.
    shop =  aliexpressToken.objects.get(aliid=value['aliId'], user=request.user.id).id
    return HttpResponseRedirect("/shop/%s/edit" % shop)

楷模:

class aliexpressToken(models.Model):
    """docstring for aliexpressToken"""
    user = models.ForeignKey(User)
    aliid = models.CharField(max_length=30)
    resource_owner = models.CharField(max_length=30)
    refresh_token = models.CharField(max_length=50)
    access_token = models.CharField(max_length=50)
    shop_name = models.CharField(max_length=50)
    shop_color = models.CharField(max_length=30)
    shop_image = models.CharField(max_length=30)
    create_time = models.DateTimeField(auto_now_add=True)

當我嘗試測試從Aliexpress獲取訪問權限時,它會提醒我int()參數必須是字符串或數字,而不是'SimpleLazyObject'。 我能做什么。 非常感謝這樣的Error Traceback,它為我提供了更多信息。 但是我無法分析發生了什么。

Traceback:
File "D:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "D:\Project\blog\aliexpress\views.py" in getToken
  108.     check = aliexpressToken.objects.filter(user=request.user, aliid=value['aliId'])
File "D:\Python27\lib\site-packages\django\db\models\manager.py" in filter
  155.         return self.get_query_set().filter(*args, **kwargs)
File "D:\Python27\lib\site-packages\django\db\models\query.py" in filter
  655.         return self._filter_or_exclude(False, *args, **kwargs)
File "D:\Python27\lib\site-packages\django\db\models\query.py" in _filter_or_exclude
  673.             clone.query.add_q(Q(*args, **kwargs))
File "D:\Python27\lib\site-packages\django\db\models\sql\query.py" in add_q
  1266.                             can_reuse=used_aliases, force_having=force_having)
File "D:\Python27\lib\site-packages\django\db\models\sql\query.py" in add_filter
  1197.                 connector)
File "D:\Python27\lib\site-packages\django\db\models\sql\where.py" in add
  71.             value = obj.prepare(lookup_type, value)
File "D:\Python27\lib\site-packages\django\db\models\sql\where.py" in prepare
  339.             return self.field.get_prep_lookup(lookup_type, value)
File "D:\Python27\lib\site-packages\django\db\models\fields\related.py" in get_prep_lookup
  143.             return self._pk_trace(value, 'get_prep_lookup', lookup_type)
File "D:\Python27\lib\site-packages\django\db\models\fields\related.py" in _pk_trace
  216.         v = getattr(field, prep_func)(lookup_type, v, **kwargs)
File "D:\Python27\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_lookup
  322.             return self.get_prep_value(value)
File "D:\Python27\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_value
  555.         return int(value)

Exception Type: TypeError at /gettoken/
Exception Value: int() argument must be a string or a number, not 'SimpleLazyObject'

用戶= request.user._wrapped,如果hasattr(request.user,'_ wrapped')否則為request.user

您的錯誤的主要原因是在這里:

#Checking the shop
check = aliexpressToken.objects.filter(user=request.user, aliid=value['aliId'])

Django創建一個包裝類SimpleLazyObject ,一旦您訪問該對象的任何屬性或成員,它將返回實際的對象。

因此,“喚醒”惰性對象:

#Checking the shop
check = aliexpressToken.objects.filter(user_pk=request.user.pk, aliid=value['aliId'])

這個問題還有其他喚醒對象的技巧,包括以下這種單一方法:

user = request.user._wrapped if hasattr(request.user,'_wrapped') else request.user
check = aliexpressToken.objects.filter(user=user, aliid=value['aliId'])

除上述內容外,還需要模型中的所有字段; 因此您需要全部通過,否則您的模型將無法保存。

您也不需要再次檢索該對象,可以直接訪問id:

result = aliexpressToken()
result.user = request.user
result.resource_owner = value['resource_owner']
result.aliid = value['aliId']
result.refresh_token = value['refresh_token']
result.access_token = value['access_token']
result.shop_name = 'Aliexpress Trade'
result.shop_color = ''
result.shop_image = ''
result.save()
shop_id = result.pk

這也是非常危險的:

#get access_token
value = eval(urllib2.urlopen(req).read())

永遠不要使用eval,尤其是永遠不要使用從外部系統接收到的東西。 如果提要中有任何錯誤,您可能最終會執行不需要的代碼。

我假設庫返回的是json,您可以簡單地執行以下操作:

import json

value = json.loads(urllib2.urlopen(req).read())

user=request.user更改為user=request.user.id

result = aliexpressToken(user=request.user.id, aliid=value['aliId'], resource_owner=value['resource_owner'], refresh_token=value['refresh_token'], access_token=value['access_token'],shop_name='Aliexpress Trade')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM