在访问可浏览的API时ModelViewSet,使用a ,get_serializer_class对于单个请求多次调用是否正常?那个self.method.request电话之间的变化值是多少?
我创建了一个小测试项目来显示行为.在project/example/views.py那里ThingViewSet有一个自定义get_serializer_class,它打印当前的请求方法.
如果启动服务器并导航到http://127.0.0.1:8000/things/1/,输出将如下所示:
./manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
May 19, 2015 - 08:51:34
Django version 1.8.1, using settings 'project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Method is: GET
Method is: PUT
Method is: PATCH
Method is: PUT
[19/May/2015 08:51:40]"GET /things/1/ HTTP/1.1" 200 11679
Run Code Online (Sandbox Code Playgroud)
显然,get_serializer_class被称为4倍,具有不同值(GET,PUT,PATCH, …
我现在花了几天时间,试图解决这个问题.在制作一个简单的项目来举例说明我的问题时,我偶然发现了一个可能的解决方案.所以,这是一个双重问题.
但首先,一些背景信息:
我刚开始使用Entity Framework 4.1(EF)和Code First为我的ASP.NET MVC项目创建模型.我需要一些类似的模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace TestApp.Models
{
public class Family
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Father> Fathers { get; set; }
public virtual ICollection<Mother> Mothers { get; set; }
}
public class Mother
{
public int ID { get; set; }
public string Name { get; set; }
public int FamilyID { get; set; }
public virtual …Run Code Online (Sandbox Code Playgroud) 我们正在将我们的前端转移到一个单独的项目(Django之外).这是一个Javascript单页面应用程序.
其中一个原因是让我们的前端开发人员更容易完成他们的工作,而不必在本地运行整个项目 - 包括API.相反,我们希望他们能够与我们设置的测试API进行通信.
我们已经设法解决了大部分CORS/CSRF问题.但是现在我们遇到了一些我无法在任何地方找到解决方案的东西,尽管阅读了大量文档和SO答案.
前台和API是从不同的域(在开发过程中提供服务localhost和test-api.example.com).到目前为止,虽然从同一个域提供服务,但前端已经能够从csrftokenAPI(Django)设置的cookie中获取CSRF令牌.但是,当从不同的域提供服务时,frontend(localhost)无法访问API(api-test.example.com)的cookie .
我正在试图找到解决这个问题的方法,以某种方式将CSRF令牌传递给前端.Django文档建议X-CSRFToken为AJAX请求设置自定义标头.如果我们在每个响应中同样为CSRF令牌提供标头并且(通过Access-Control-Expose-Headers)允许前端读取此标头,我们是否会破坏CSRF保护?
鉴于我们已经为API正确设置了CORS(即只允许某些域对API进行跨域请求),第三方站点上的JS应该无法读取此响应头,因此无法做出妥协AJAX请求我们的用户背后,对吧?还是我错过了一些重要的事情?
还是有另一种更好的方法来实现我们想要的东西吗?