python - UnboundLocalError:分配前引用的局部变量“pin”
问题描述
我一直在制作一个像 Pinterest 一样的网站,现在我正在使用“login_required”装饰器开发搜索功能。该视图尚未完成,因为我在检查请求是否通过 Postman 顺利通过时构建了此视图。但是,该请求甚至没有到达视图中的第一行代码,因为我不断收到此错误。下面是我使用 python 调试器测试它时看到的内容。
-> return func(self, request, *args, **kwargs)
(Pdb) n
UnboundLocalError: local variable 'pin' referenced before assignment
> /Users/woohyunan/projects/Wecode/pinterrorist-backend/pin/views.py(38)wrapper()
下面是整个views.py的SearchView部分:
class SearchView(View):
@login_required
def post(self, request, *args, **kwargs):
body = json.loads(request.body)
user = kwargs['user']
user_id = kwargs['user_id']
search_term = request.POST.get('search', None)
return JsonResponse({'search_term': search_term})
下面是装饰器:
def login_required(func):
def wrapper(self, request, *args, **kwargs):
import pdb; pdb.set_trace()
header_token = request.META.get('HTTP_AUTHORIZATION')
decoded_token = jwt.decode(header_token, SECRET_KEY, algorithm='HS256')['id']
user = User.objects.get(id=decoded_token)
user_id = user.id
kwargs['user'] = user
kwargs['user_id'] = user_id
try:
if User.objects.filter(id=decoded_token).exists():
return func(self, request, *args, **kwargs)
else:
return JsonResponse({"message": "THE USER DOES NOT EXIST"})
except jwt.DecodeError:
return JsonResponse({"message": "WRONG_TOKEN!"}, status=403)
except KeyError:
return JsonResponse({"message": "KEY ERROR"}, status=405)
except User.objects.filter(email=decoded_token).DoesNotExist:
return JsonResponse({"message": "USER NOT FOUND"}, status=406)
return wrapper
如果你需要更多关于这个神秘变量“pin”的细节,下面是整个views.py:
import boto3
import json
import jwt
from django.shortcuts import render
from django.views import View
from django.http import JsonResponse, HttpResponse
from django.forms.models import model_to_dict
from django.core import serializers
from django.db.models import Q
from pin.models import (
Topic,
UserTopic,
Board,
Pin,
Topic,
PinUser,
PinTopic,
Comment
)
from account.models import User, Follow, Social
from pinterrorist.settings import S3URL, SECRET_KEY
def login_required(func):
def wrapper(self, request, *args, **kwargs):
import pdb; pdb.set_trace()
header_token = request.META.get('HTTP_AUTHORIZATION')
decoded_token = jwt.decode(header_token, SECRET_KEY, algorithm='HS256')['id']
user = User.objects.get(id=decoded_token)
user_id = user.id
kwargs['user'] = user
kwargs['user_id'] = user_id
try:
if User.objects.filter(id=decoded_token).exists():
return func(self, request, *args, **kwargs)
else:
return JsonResponse({"message": "THE USER DOES NOT EXIST"})
except jwt.DecodeError:
return JsonResponse({"message": "WRONG_TOKEN!"}, status=403)
except KeyError:
return JsonResponse({"message": "KEY ERROR"}, status=405)
except User.objects.filter(email=decoded_token).DoesNotExist:
return JsonResponse({"message": "USER NOT FOUND"}, status=406)
return wrapper
class IntroTopicView(View):
@login_required
def get(self, request, *args, **kwargs):
user = kwargs['user']
user_id = kwargs['user_id']
topiclst = list(Topic.objects.values())
return JsonResponse({"topics": topiclst})
@login_required
def post(self, request, *args, **kwargs):
body = json.loads(request.body)
user = kwargs['user']
user_id = kwargs['user_id']
chosen_topics = body['chosen_topics']
for topic in chosen_topics:
user.topics.add(topic)
return JsonResponse({'chosen_topics': chosen_topics}, status=200)
class MyPageView(View):
@login_required
def get(self, request, **kwargs):
# receive the user object from the decorator
user = kwargs['user']
user_id = kwargs['user_id']
# receive the user's interested topics
pins = []
topics = user.topics.all()
for topic in topics:
for pin in Pin.objects.filter(topic=topic):
pins.append(pin)
pin_user_data = serializers.serialize('json', pin.user.all())
pins_detail = [{"image":pin.image_url, "text1":pin.paragraph1, "text2":pin.paragraph2, "users": pin_user_data} for pin in pins]
return JsonResponse({"pins" : pins_detail})
class CommentView(View):
@login_required
def post(self, request, pin, **kwargs):
user = kwargs['user']
user_id = kwargs['user_id']
pin_id = pin
body = json.loads(request.body)
comment = body['comment']
pin = Pin.objects.get(id=pin_id)
new_comment = Comment.objects.create(content=comment, pin=pin, user=user)
pin_comment = pin.comments.all()
try:
pin_comment_info = [{"user": comment.user.email.split("@")[0], "comment": model_to_dict(comment)} for comment in pin_comment]
except AttributeError:
pin_comment_info = [{"user": comment.user.social_id, "comment": model_to_dict(comment)} for comment in pin_comment]
comment_len = len(pin_comment)
pin_user_data = serializers.serialize('json', pin.user.all())
return JsonResponse({"pin": {"id": pin.id, "image_url": pin.image_url, "text1": pin.paragraph1, "text2": pin.paragraph2, "users": pin_user_data}, "comment": pin_comment_info, "comment_total": comment_len})
@login_required
def delete(self, request, pin, **kwargs):
user = kwargs['user']
user_id = kwargs['user_id']
pin_id = pin
body = json.loads(request.body)
comment_id = body['comment_id']
pin = Pin.objects.get(id=pin_id)
Comment.objects.get(id=comment_id).delete()
pin_comment = pin.comments.all()
try:
pin_comment_info = [{"user": comment.user.email.split("@")[0], "comment": model_to_dict(comment)} for comment in pin_comment]
except AttributeError:
pin_comment_info = [{"user": comment.user.social_id, "comment": model_to_dict(comment)} for comment in pin_comment]
comment_len = len(pin_comment)
pin_user_data = serializers.serialize('json', pin.user.all())
return JsonResponse({"pin": {"id": pin.id, "image_url": pin.image_url, "text1": pin.paragraph1, "text2": pin.paragraph2, "users": pin_user_data}, "comment": pin_comment_info, "comment_total": comment_len})
@login_required
def get(self, request, pin, **kwargs):
user = kwargs['user']
user_id = kwargs['user_id']
pin_id = pin
pin = Pin.objects.get(id=pin_id)
pin_comment = pin.comments.all()
try:
pin_comment_info = [{"user": comment.user.email.split("@")[0], "comment": model_to_dict(comment)} for comment in pin_comment]
except AttributeError:
pin_comment_info = [{"user": comment.user.social_id, "comment": model_to_dict(comment)} for comment in pin_comment]
comment_len = len(pin_comment)
pin_user_data = serializers.serialize('json', pin.user.all())
return JsonResponse({"pin": {"id": pin.id, "image_url": pin.image_url, "text1": pin.paragraph1, "text2": pin.paragraph2, "users": pin_user_data}, "comment": pin_comment_info, "comment_total": comment_len})
class PinView(View):
@login_required
def get(self, request, pin, **kwargs):
user = kwargs['user']
user_id = kwargs['user_id']
pin_id = pin
pin = Pin.objects.get(id=pin_id)
pin_comment = pin.comments.all()
try:
pin_comment_info = [{"user": comment.user.email.split("@")[0], "comment": model_to_dict(comment)} for comment in pin_comment]
except AttributeError:
pin_comment_info = [{"user": comment.user.social_id, "comment": model_to_dict(comment)} for comment in pin_comment]
comment_len = len(pin_comment)
pin_user_data = serializers.serialize('json', pin.user.all())
return JsonResponse({"pin": {"id": pin.id, "image_url": pin.image_url, "text1": pin.paragraph1, "text2": pin.paragraph2, "users": pin_user_data}, "comment": pin_comment_info, "comment_total": comment_len})
class SearchView(View):
@login_required
def post(self, request, *args, **kwargs):
body = json.loads(request.body)
user = kwargs['user']
user_id = kwargs['user_id']
search_term = request.POST.get('search', None)
return JsonResponse({'search_term': search_term})
我该如何摆脱这个错误?我已经尝试了一切,但它并没有消失......
提前非常感谢!
解决方案
这里:
pin_user_data = serializers.serialize('json', pin.user.all())
这条线不在循环中。所以你的“别针”可能没有定义。
推荐阅读
- php - woocommerce 构建类别树
- java - 如何将 BufferedImage 加载到可运行的 JAR 文件中?
- spring-cloud-contract - 在 json 路径断言中使用查询字符串参数定义合约
- azure - Azure 逻辑应用 - 从 http 请求接收文件
- bash - 如何将复杂的文件 glob 传递给子 shell?
- javascript - 如何在网页上找到这个元素?
- regex - 如何从 1 匹配到 12。给定 Version/13.1.2
- google-cloud-platform - 从 Java 中的 pub sub 流式传输时使用 PubSub-NullPointerException 进行 Spark Streaming
- python-3.x - 无法创建多个类的对象
- google-apps-script - exec节点调用gaction令牌时如何将其传递给gactions(无运算符)