Python Django规则设置问题:自定义用户模型的\u perm是否始终为False
我是Django的新手。我一直在尝试设置一个自定义用户模型,但在尝试访问页面时,却一直使用404。以下是设置的外观: 自定义用户模型Python Django规则设置问题:自定义用户模型的\u perm是否始终为False,python,django,debugging,django-rules,Python,Django,Debugging,Django Rules,我是Django的新手。我一直在尝试设置一个自定义用户模型,但在尝试访问页面时,却一直使用404。以下是设置的外观: 自定义用户模型 class User(AbstractBaseUser, PermissionsMixin): class Meta: verbose_name = _('user') verbose_name_plural = _('users') id = models.UUIDField(primary_key=True,
class User(AbstractBaseUser, PermissionsMixin):
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
is_active = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
设置.py
AUTHENTICATION_BACKENDS = (
'rules.permissions.ObjectPermissionBackend',
'django.contrib.auth.backends.ModelBackend',
)
已安装的应用程序
INSTALLED_APPS = [
# ...
'rules.apps.AutodiscoverRulesConfig',
]
rules.py
@rules.predicate
def is_organisation_member(user, organisation):
"""Check if user is an active organisation member"""
m = get_if_exists(
OrganisationMember,
user=user,
organisation=organisation,
organisation__state=Organisation.LifecycleState.ACTIVE
)
if not m:
return False
if not m.is_active:
return False
return True
rules.add_perm('organisations.member', (is_authenticated & is_active & is_organisation_member))
views.py
def get_organisation_by_slug(request, *args, **kwargs):
return get_object_or_404(Organisation, workspace_name=kwargs['workspace'])
@permission_required('organisations.member', fn=get_organisation_by_slug)
def OrganisationView(request, workspace):
# ...
url.py
urlpatterns = [
path('admin/', admin.site.urls),
# ...
# organisation
path('<str:workspace>', v.OrganisationView, name="organisation-show"),
# ...
]
urlpatterns=[
路径('admin/',admin.site.url),
# ...
#组织机构
路径(“”,v.OrganizationView,name=“Organization show”),
# ...
]
根据调试,is_organization_member
返回True,但用户在尝试查看页面时仍会收到404错误(没有django规则所需的权限
修饰页面)。你知道为什么我会收到404的回复吗
如果没有django规则的权限,\u需要
装饰程序,页面将正常工作
那只说了一半!当发电机被拆下且存在现有测试数据时,它工作正常。但是当查询没有返回任何内容时,404错误就出现了
我错误地认为问题在于设置规则,但在删除装饰程序后,错误仍然存在。我以前没有看到这个错误,因为我总是自动生成测试数据(项目列表),但这次没有。因此,在查看view函数后,我意识到当项目查询返回空列表时,我提出了一个404错误:
@permission_required('organisations.member', fn=get_organisation_by_slug)
def OrganisationView(request, workspace):
# Query strings:
# Extract 'tab' value appended to url as
# ?tab=projects
tab = request.GET.get('tab', '')
# Get organisation
try:
o = Organisation.objects.get(workspace_name=workspace)
except Organisation.DoesNotExist:
raise Http404("Not found.")
if tab == 'projects':
# Get project list
try:
p = Project.objects.filter(organisation__workspace_name=workspace) \
.order_by('-created_at')
except Project.DoesNotExist:
raise Http404("Not found")
else:
raise Http404("Not found...") # ERROR CAUSED BY THIS LINE
# To fix the error, I have removed the above line and added the below query
# p = Project.objects.filter(organisation__workspace_name=workspace) \
# .order_by('-created_at')
# Set context
context = {
'o': o,
'projects': p
}
return render(request, 'bb/home.html', context)
因为我确信我的观点是正确的,所以我没有发布完整的函数,这使得其他人很难发现错误。在添加
has_perm(self,perm,obj=None)后,我意识到错误出现在视图中:将True
返回到用户模型,但仍然得到一个404错误。如果你的url.py错误,或者如果你确实得到而不是POST或类似的东西,你会像通常得到这个错误一样向我们显示完整的错误吗?当然:页面未找到(404)请求方法:获取请求URL:http://127.0.0.1:8000/abc1 未找到引发者:bb.views.OrganizationView您看到此错误,因为您的Django设置文件中有DEBUG=True。将其更改为False,Django将显示一个标准404页面。
url为:。abc1是组织的名称,它位于数据库中。当我删除装饰器时,url会工作。请添加您的url。p当然,完成。谢谢@AyanSh感谢您回顾这个问题,当您询问url.py时,我开始怀疑这个问题是否在不同的地方,并开始在不同的地方调整代码。