【发布时间】:2022-01-19 01:31:10
【问题描述】:
更新: 被告知这可能是由于身份验证过程中的一些错误。这是我的身份验证:
const LogIn = () => {
let dispatch = useDispatch();
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
// const auth = useAuth();
const history = useHistory();
const onSubmit = async (e) => {
e.preventDefault();
dispatch(startLogin());
axios
.post(
"http://127.0.0.1:8000/api/login/",
{ username: username, password: password },
{ headers: { "Content-Type": "application/json" } }
)
.then((res) => {
const users = res.data;
dispatch(LogInSuccess(users));
localStorage.setItem("jwt", users.auth_token);
localStorage.setItem("user", JSON.stringify(users));
console.log("users", users); // undefined
history.push("/");
})
.catch((err) => dispatch(LogInFailure(err.message)));
};
所以我的代码是用 Django 后端和 React 前端编写的。
出于某种原因,所有者/用户没有过滤对象(在本例中为老鼠)。我不想授予权限 - 任何人都应该能够访问其他人的老鼠,但在这个特定列表中,用户应该只能看到属于他们的老鼠。
运行其他过滤器工作,例如生日。但是当我尝试按用户过滤时,没有老鼠出现。也没有错误。有什么问题?
对象序列化器:
class RatSerializer(FlexFieldsModelSerializer):
user = serializers.CharField()
body_colour = BodyColourSerializer()
eye_colour = EyeColourSerializer()
image = ImageSerializer()
class Meta:
model = rat
观看次数:
class ratViewset(FlexFieldsMixin):
serializer_class = RatSerializer
def get_queryset(self):
userid = self.request.id
return rat.objects.filter(user = userid)
用户序列化器:
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
class Meta:
model = User
fields = ('id', 'username', 'password')
以及用户的 JSON 输出:
{
"id": 13,
"username": "new"
}
在对象/老鼠的 JSON 输出中,它清楚地说明了它属于哪个用户。那么为什么过滤器不起作用呢?
【问题讨论】:
-
是否有可能
self.requset.id是一个字符串而id字段是一个整数?所以你他们不匹配?也许将您的self.request.id转换为 int? -
根据您的情况,使用
request.user而不是从请求对象中提取查询参数也是一个好主意。如果它应该是“只显示经过身份验证的用户他们自己的对象”而不是“显示具有 id X 的用户的对象,无论身份验证如何”。如果是后者,我个人可能会将该 ID 作为 URL 的一部分而不是查询 arg。在某种程度上,我可以在 URL 声明中使用正则表达式来确保我 可以 将其解析为 int。 -
@saquintes 可能是这种情况,我该怎么做? (我是初学者)
-
@Peter DeGlopper 哦,所以您认为与其提取查询参数,不如说您的 URL 应该类似于“/userID/objects”?这是一个非常好的主意,然后用户也可以查看彼此的列表。不知道该怎么做,因为我是新手
-
我可能会使用
/objects/<userId>,但这没什么大不了的,取决于应用程序的其余部分。请在此处查看文档中的示例:docs.djangoproject.com/en/4.0/topics/http/urls/#example - 看起来功能已经先进,您只需声明/objects/<int:userId>或任何您想要的,然后您的视图将获得一个int参数。请注意,这根本不安全,它可能适合您的情况,因为您说每个人都可以看到每个人的数据,但没有什么可以强制 URL 中的 ID 是针对当前用户的。