Python 如何为API设置仅发布数据的权限(React&x2B;Django Rest框架)
我正在写我的博客,React作为前端,DRF作为后端。我已经制作了两个API——一个用于帖子,另一个用于联系人表单中包含的数据。为了获得帖子,我使用axios,Django权限设置为Python 如何为API设置仅发布数据的权限(React&x2B;Django Rest框架),python,django,reactjs,django-rest-framework,django-serializer,Python,Django,Reactjs,Django Rest Framework,Django Serializer,我正在写我的博客,React作为前端,DRF作为后端。我已经制作了两个API——一个用于帖子,另一个用于联系人表单中包含的数据。为了获得帖子,我使用axios,Django权限设置为IsAdmin——这意味着只有管理员可以更改帖子,这很好 第二个问题是-如果我将权限更改为AllowAny,这会导致匿名用户可以发布他们的数据并。。。他们可以查看它。如果我将其更改为isadmin用户,则任何用户都无法发布其数据。我需要知道如何安全地存储人们的数据(他们只能发布数据,不允许查看我的联系人表单API)
IsAdmin
——这意味着只有管理员可以更改帖子,这很好
第二个问题是-如果我将权限更改为AllowAny
,这会导致匿名用户可以发布他们的数据并。。。他们可以查看它。如果我将其更改为isadmin用户
,则任何用户都无法发布其数据。我需要知道如何安全地存储人们的数据(他们只能发布数据,不允许查看我的联系人表单API)
Contact.js
const Contact = () => {
return (
<section>
<Formik
validate
initialValues={{
firstName: "",
email: "",
}}
onSubmit={values => {
setTimeout(() => {
axios
.post("http://127.0.0.1:8000/api/questions/", values)
.then(res => {
alert("Sent", res.data);
})
.catch(err => {
alert(err);
});
// console.log(JSON.stringify(values, null, 2));
}, 500);
}}
render={() => (
<Form>
<label htmlFor="firstName">Name</label>
<Field name="firstName" placeholder="Name" required />
<label htmlFor="email">Email</label>
<Field
name="email"
placeholder="email@acme.com"
type="email"
required
/>
<button type="submit">Submit</button>
</Form>
)}
/>
</section>
);
};
我之前提到过,我无法将权限\u类更改为权限。允许
,因为每个人都可以查看已提交我的联系人表单的人员列表。我无法将其更改为isadmin
,因为联系人表单当时不起作用
问题:是否有任何函数或类允许匿名用户在未经许可的情况下发布其数据以查看我的API?您可以从APIView
insetad派生视图,并仅实现POST方法,如下所示:
从rest\u framework.views导入APIView
类问题视图集(APIView):
权限\类=(permissions.AllowAny,)
def post(自我、请求、格式=无):
序列化程序=问题序列化程序(数据=请求.数据)
如果序列化程序.u有效():
serializer.save()
返回响应({'status':'OK'})
返回响应(serializer.errors,状态=400)
参考:您可以创建自己的自定义权限类
from rest_framework.permissions import BasePermission
class PostOnlyPermissions(BasePermssion):
def has_permission(self, request, view):
if self.action in ('create', ): // for POST method the action in DRF is create
return True
return False
然后只需在视图集中调用权限类
class QuestionsViewSet(viewsets.ModelViewSet):
permission_classes = (PostOnlyPermissions, )
谢谢你,我将在不久的将来试一试。
class QuestionsViewSet(viewsets.ModelViewSet):
permission_classes = (PostOnlyPermissions, )