使用 django-messages 时,将我的整个 `request` 对象传递到我的 `Models.py` 以在 Django 中进行验证是否不好?

Is it bad to pass my entire `request` object to my `Models.py` for validations in Django when using django-messages?

找不到这个问题的完全明确的答案。在我的学习中,我被教导在尝试将数据从 views.py 传递到 models.py 时不要传递整个 request 对象(当使用 django 管理器时)。

但是,在我当前的情况下,我正在尝试在我的 models.py(使用管理器)中设置验证方法,从而我利用 django-messageshttps://docs.djangoproject.com/en/1.11/ref/contrib/messages/),给谁一个要求是生成自定义错误时的 request 对象本身,例如:

messages.add_message(request, REG_ERR, 'First and last name are required must be at least 2 characters.', extra_tags="reg_errors")

我正在尝试使用管理器 (https://docs.djangoproject.com/en/1.11/topics/db/managers/) 在我的 models.py 中保留所有验证、错误消息生成以及创建或检索操作,并简单地将相关数据返回给我views.py.

为了实现这一点,在我的 views.py 中,我创建了一个包含完整 request 对象本身的字典,我将它发送给所有 validations/creations,然后检查错误如果标记了任何验证错误,return 作为 False 将被 returned。否则成功页面将加载新用户。

views.py:

def register(request):
    if request.method == "POST":

        # Validate registration data submitted from registration form:
        validated = User.objects.register_validate(request)

        # If validation fails, load index page with request object 
        # (which `django messaging` has attached errors to):
        if validated == False:
                print "User could not be registered."
                # Send back index with updated request object:
                return render(request, "logreg/index.html")

        # If validation successful, create new user and send it along with success page:
        else:
            # Load success page with `validated` user (already returned as a `dict` obj.)
            return render(request, "logreg/success.html", validated)

models.py:

# Note: this function snippet is part of `class UserManager(models.Manager)`:
def register_validate(self, request):

    # Check if first_name or last_name is less than 2 characters:
    if len(request.POST["first_name"]) < 2 or len(request.POST["last_name"]) < 2:
        # Add error to Django's error messaging:
        messages.add_message(request, REG_ERR, 'First and last name are required must be at least 2 characters.', extra_tags="reg_errors")

    # ... more validations ...

    # Get current errors to check if any exist:
    errors = get_messages(request)

    # If no validation errors, hash password, create user and send new user back:
    if len(errors) == 0:
        # Hash Password:
        hashed_pwd = bcrypt.hashpw(request.POST["password"].encode(), bcrypt.gensalt(14))
        # Create new validated User:
        validated_user = {
            "logged_in_user": User(first_name=request.POST["first_name"], last_name=request.POST["last_name"], email=request.POST["email"], password=hashed_pwd)
        }
        # Save new User:
        validated_user["logged_in_user"].save()
        # Send newly created validated User back:
        return validated_user
    else:
       return False

问题:

之前我通过request.POST["my_data"]request对象中提取了所有数据(没有传递整个对象而是将我需要的内容提取到自定义dict中),并且是自定义的生成错误消息。但是,我想练习使用 django-messages,(其中需要 request 对象作为参数,因为这是它将错误附加到的对象)。因为我希望所有验证都发生在 models.py 中,所以我发送了整个 request 对象(然后提取表单数据,但也用 django-messages 创建新消息)。

传递整个 request 对象是否会导致性能大幅下降,或者这是不好的做法? 事实上,我的学习课程太过分了强调没有传递整个 request 对象让我有点困惑,特别是考虑到通过 django-messages 在我的 models.py 中产生错误,我需要访问完整的对象。

有什么想法吗?

注意:我的另一个想法是让我的验证函数 return 一个错误列表,我可以对其进行迭代并生成 django-messages 错误(并使用 request views.py 中的对象),但这会在控制器上放置更多 logic/crunching,并试图在管理器中(在 models.py 中)保持一切良好和紧凑 simplicity/organization.

预先感谢您的阅读,如果我需要澄清此处提供的任何信息,请告诉我...试图提供我的代码的最小块以提供上下文。

附加整个 request 对象不一定会影响性能,但它确实会带来 安全性 问题,就好像正在发送整个 request models.py,欺骗性请求可能会干扰预期功能。

通过与其他开发人员在 slack 频道中的交谈,听起来大多数人在 models.py 中生成了一个错误列表,该列表被返回给 views.py,他们在其中调用 django-messages 模块并创建他们的消息。主要论点是限制对 request 对象本身的访问,使其远离 models.py 并降低欺骗请求的风险。