使用 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-messages
(https://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
并降低欺骗请求的风险。
找不到这个问题的完全明确的答案。在我的学习中,我被教导在尝试将数据从 views.py
传递到 models.py
时不要传递整个 request
对象(当使用 django 管理器时)。
但是,在我当前的情况下,我正在尝试在我的 models.py
(使用管理器)中设置验证方法,从而我利用 django-messages
(https://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
并降低欺骗请求的风险。