我正在尝试使用Vue.js对我使用Django Rest Framework创建的REST Api执行一些POST方法.问题是,CSRF Failed: CSRF token missing or incorrect.
我发帖时收到错误.但我可以看到csrf cookie,它被添加到标题中.
这是我的设置:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
'rest_framework.permissions.DjangoModelPermissions'
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
)
}
Run Code Online (Sandbox Code Playgroud)
这是我的Vue.js配置:
var csrftoken = Cookies.get('csrftoken');
Vue.http.headers.common['HTTP_X_CSRFTOKEN'] = csrftoken;
Run Code Online (Sandbox Code Playgroud)
这是发送的标题的相关部分:
Cookie:djdt=hide; tabstyle=raw-tab; sessionid=1gl533mrneudxw3l9l2vg0ja1yowwmeo; csrftoken=dN85bhztB1oVRov87BsUrWTM29Ff9sjn
Host:127.0.0.1:8000
HTTP_X_CSRFTOKEN:dN85bhztB1oVRov87BsUrWTM29Ff9sjn
Origin:http://127.0.0.1:8000
Referer:http://127.0.0.1:8000/agencies/6/add-profiles/
Run Code Online (Sandbox Code Playgroud)
如您所见,Cookie.csrf和HTTP_X_CSRFTOKEN标头匹配
我真的很难过.有什么建议?
我真的被困住了。这就是我想要做的。
一切都很好本地化。一旦我将其投入生产,我就开始收到 CSRF 错误。这就是一切的运作方式。
我已经看到了从关闭 CSRF 到允许所有事情的所有答案。我想正确地做到这一点,而不仅仅是关闭和打开所有东西并最终导致安全漏洞。
所以,这就是我所拥有的。
已安装:django-cors-headers django-rest-framework drf-nested-routers ...等
我的 api 在 api.websitename.com 上运行,Vue.js 应用程序在 websitename.com 上运行。
GET 请求效果很好。OPTION 请求似乎有效。
任何有风险的请求都不起作用。
对于我的 CORS,我'corsheaders.middleware.CorsMiddleware',
在其他MIDDLEWARE
.
然后我的 CORS 设置是:
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'*.websitename.com',
)
Run Code Online (Sandbox Code Playgroud)
我的 CSRF 设置是:
CSRF_TRUSTED_ORIGINS = [
"api.websitename.com",
]
Run Code Online (Sandbox Code Playgroud)
无论我如何使用这些,最终都会出现 CSRF 令牌错误。
我已经尝试过在我的 Vue App.vue 文件中做这样的事情的方法:
mounted () {
this.getCSRFToken() …
Run Code Online (Sandbox Code Playgroud) django django-csrf django-rest-framework vue.js django-cors-headers
我有一个相当简单的模型,使用Django Taggit进行标记.
一切都很好,但现在我想扩展一些功能,我有点困惑.
我想要的是两种观点.
一个显示系统中的所有标签.一个显示我的应用程序中具有特定标记的所有内容.
对我来说有意义的是为每个视图执行以下操作.
在views.py中为myapp
所有标签
来自myapp.models导入App
来自taggit.models导入标签
class TagList(ListView):
msgstr"""获取db中的所有标签"""
queryset = Tag.objects.all()
template_name = "myapp/TagList.html"
paginate_by = 10
Run Code Online (Sandbox Code Playgroud)标签的所有内容
来自myapp.models导入App
来自taggit.models导入标签
class TaggedList(ListView):"""获取标签的所有内容"""
template_name = "myapp/TaggedList.html"
def get_object(self):
return get_list_or_404(App, tag__iexact=self.kwargs['tag'])
Run Code Online (Sandbox Code Playgroud)我是不是已经失去了理智,还是那么容易?顺便说一下,我正在使用泛型类视图.
谢谢您的帮助.戴夫
我现在已经看了好几个小时了,我找不到解决办法.我只是没有得到它.
我有一个有很多孩子的父母.我创建了一个视图,允许我获取所有父母的孩子.现在我想结束该列表并使用新的子列表对父进行PATCH.我知道我需要编写一个自定义update
方法,但我无法弄清楚如何使这个工作.
这是我的Child Serializer:
class ChildSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Child
fields = ('id', 'url', 'name',)
Run Code Online (Sandbox Code Playgroud)
这是我的父序列化器:
class ParentSerializer(serializers.HyperlinkedModelSerializer):
children = ChildSerializer(many=True)
class Meta:
model = models.Parent
fields = ('id', 'url', 'name', 'children',)
def update(self, instance, validated_data):
submitted_children = validated_data.get('children')
if submitted_children:
for child in submitted_children:
child_instance = Child.objects.get(id=child.id)
instance.children.add(child_instance)
instance.save()
return instance
Run Code Online (Sandbox Code Playgroud)
我对需要发生的事情的理解是......
validated_data.pop('children')
我可能在这里尝试了十几种不同的想法,但我似乎无法让它发挥作用.上面的代码不会更改children_set.
任何建议都非常受欢迎.
作为参考,我研究了以下内容:
http://www.django-rest-framework.org/api-guide/serializers/#saving-instances
http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations
http://www.django-rest-framework.org/api-guide/serializers/#validation
还有一堆,但我现在不记得了
更新:
[{"id":2,"url":" http://127.0.0.1:8000/api/v1/children/2 ","first_name":"Tom","last_name":"Jones","date_ofhirth ":"1969-03-14"}]
我想创建一个允许我创建记录副本的Django Admin Action.
继承人的用例.
管理员单击要复制的应用中记录旁边的复选框.管理员从管理操作下拉菜单中选择"重复".管理员点击进入.Django admin使用新的id创建重复记录.页面被刷新,新的重复与id一起添加.管理员点击新的重复记录并对其进行编辑.管理员点击保存.
我疯了还是这是一个非常直接的管理行动?
我一直在使用这些文档作为参考:http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/
我在想这样的事情:
在我的应用程序:
def duplicate(modeladmin, request, queryset):
new = obj.id
queryset.create(new)
return None
duplicate.short_description = "Duplicate selected record"
Run Code Online (Sandbox Code Playgroud)
我知道那不对......但是我的想法很接近吗?
我想建立一个清单.没问题.
for (i = 0; i < 7; i++) {
$('#domid').append(variable.clone());
}
Run Code Online (Sandbox Code Playgroud)
如何获取列表中的最后一项(在本例中为i.7)并为其添加一个类?
for (i = 0; i < 7; i++) {
$('#domid').append(variable.clone());
if (i===7) {
$('.domclass').addClass('last');
};
}
Run Code Online (Sandbox Code Playgroud)
但那不行.这使得当计数器得到7时,所有.todo项都有类.
有关如何找到这个的任何建议?
谢谢!
我想编写一个except子句,如果查询集中没有某些内容,则重定向用户.欢迎任何建议.我是一个Python noob,我得到的是这里的问题.
这是我目前的代码:
def get_queryset(self):
try:
var = Model.objects.filter(user=self.request.user, done=False)
except:
pass
return var
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
def get_queryset(self):
try:
var = Model.objects.filter(user=self.request.user, done=False)
except:
redirect('add_view')
return var
Run Code Online (Sandbox Code Playgroud) 我知道这很简单,但我错过了一些东西.因为我永远记不住这一点,我希望这可以在这里记录解决方案.
我想要做的就是为URL中的对象传递PK并获取详细信息视图.
网址:
url(regex=r'^(?P<pk>\d+)/$',
view=AdventureDetail.as_view(),
name='adventure_detail',
),
Run Code Online (Sandbox Code Playgroud)
视图:
class AdventureDetail(DetailView):
""" Get a time entry detail view """
template_name = "adventure/AdventureDetail.html"
def get_object(self):
return get_object_or_404(Page)
Run Code Online (Sandbox Code Playgroud)
但我得到一个"多个对象返回错误"
MultipleObjectsReturned at/1/get()返回多个Page - 它返回5!查找参数为{}
这感觉真的很傻.它应该"正常工作",但我遗漏了一些明显的东西.
谢谢您的帮助.
一旦POST成功完成,我想发送电子邮件.似乎有意义的是,电子邮件将通过信号完成.我可以自己编写,如下所示:https://docs.djangoproject.com/en/1.6/topics/signals/#defining-and-sending-signals
但是,我无法弄清楚的是:
建议欢迎.
还有,有人用Angular这样做吗?有没有一种简单的方法可以做到这一点,我没有看到?
我在这里基于Thinkster IO教程为应用程序编写自定义用户身份验证:https ://thinkster.io/django-angularjs-tutorial/
我已经对用户创建进行了调整,以使用确认的密码,然后进行保存。
我以为我一切都很好,但是我陷入了一个错误。
我相信这是问题代码。
def create(self, validated_data):
# get the password or leave it alone
password = validated_data.get('password', None)
# get the confirm_password or leave it alone
confirm_password = validated_data.get('confirm_password', None)
# If the password exists AND the confirm password exists AND they eaqual each other
if password and confirm_password and password == confirm_password:
# create the object with valid form data
return models.Account.objects.create(**validated_data)
Run Code Online (Sandbox Code Playgroud)
错误是: 'confirm_password' is an invalid keyword argument for this function
看起来好像是由我对API的看法触发的。为什么会这样呢?在我看来,这不应该成为问题,因为保存之前在视图中进行了检查,并且如果匹配则仅使用密码。
任何帮助都会很棒。
这是完整的序列化器 …
django ×9
django-views ×3
vue.js ×3
angularjs ×2
django-admin ×1
django-csrf ×1
javascript ×1
jquery ×1