当前位置: 首页 > 网络应用技术

Django如何解决交叉域问题?

时间:2023-03-07 21:29:57 网络应用技术

  指南:本文的首席执行官注释将向您介绍Django如何解决交叉域问题的相关内容。我希望这对每个人都会有所帮助。让我们来看看。

  背景是NGINX+UWSGI+DJANGO,它配置为公司的内部网络域名,但是一段时间后,将报告一个接口。

  在最初的调查过程中,已经证实,跨域Django已在Django中配置,并且在使用一段时间后发生了交叉域。发现在交叉域错误时清洁cookie会解决问题,然后删除cookie中的测试是否是因为某种方法是因为某种方式,因此cookie引起的交叉域,最终发现这是由用户的关键名称引起的交叉域。发现与用户相对应的cookie的长度为283.,因为cookie太长了,交叉域。

  发现曲奇的原因太长了。其余的是检查造成特定配置的位置。首先,检查服务接口呼叫日志,并在报告浏览器时发现浏览器没有接口调用日志。在NGINX的相关配置中找到问题。起初,我认为这是NGINX缓冲区大小的大小的问题。后来,我发现变更后的问题仍然存在。最后,我想到了UWSGI的配置。最后,发现UWSGI的缓冲尺寸默认为4K,最终调整为32K以求解它以解决它。

  后端使用的DRF是UWSGI+NGINX

  输入服务器项目文件目录,我的django项目放置在“/usr/myprojects/” directory.create uwsgi.ini文件中的uwsgi.ini文件中。

  测试效果命令:

  如果您访问:xxx.xxx.xxx.xx:8000成功,那么uwsgi.ini配置成功

  我的nginx.conf位置是“ /etc/nginx/nginx.conf”

  配置文件如下:

  1.第一行

  主要是给予NGINX加权。部署历史记录路线后,将删除地址背后的“#”号码。包装部署后,将会有一个错误。

  2.如果显示配置,则有两个服务器部署了前端服务和后端服务。值得注意的是,两台服务器使用同一服务器,这与侦听不同。

  3. VUE部署需要注意反向代理地址:

  和随后的端口问题

  4.后端服务器需要注意该位置的UWSGI_Pass后面的最终口号。

  5.交叉 - 域问题。如果我需要在自己的在线上找到配置,我没有遇到它,因为我在Django的设置中配置了交叉域。

  6. Django Suit背景管理样式已经崩溃,需要更改,但是可以正常访问API。

  7.我开始在后台收听端口8008,并在前端监视端口80中听,以便前端显示出良好的外观。尽管可以正常访问背景API,但VUE的本地开发环境也可以正常运行,并且文本和图片资源都正常显示。结果,它无法显示。对于地图,我选择了前面- 末端监视器以收听端口8008,后端监视80,并且显示后显示正常。原因尚不清楚////////// erly谈论它。

  8.不要问我为什么我将前端和后端分开并在服务器上部署?糟糕,只是测试,这不是必需的

  9.本文仅适合入门

  关于Django的后台管理员(西装)修改(参考:Django中文网站:)

  在环境中输入项目目录,您需要收集CSS样式并在终端中输入命令:

  接下来,您可以找到静态文件包含CSS文件。此时,该网站已打开,样式显示正常

  UWSGI启动xxx.ini后,将在同一目录中生成xxx.pid文件。UWSGI主要过程的过程数中只有一行内容。

  关于UWSGI,输入同一目录

  课

  如果您无法获得环境,请指定环境

  另外:请记住重新启动UWSGI并重新启动NGINX。

  暴力删除:Fuser -K 80/TCP

  Netstat -aptn命令行,检查所有开放端口号码

  netstat -tlp |GREP 80查看是否使用了特定端口

  PS -EF |grep uwsgi查看是否存在UWSGI端口

  交叉域问题来自JavaScript的同源策略,也就是说,仅相同的协议+主机名+端口号(如果存在)是相同的,并且允许相互访问。也就是说,JavaScript只能访问和操作在其自身域中的资源,无法在其他域中访问和操作资源。

  注意:localhost和127.0.0.1也是交叉域。

  如果由Origin指定的源不在权限的范围内,则服务器将在没有访问控制的情况下返回响应。当解决浏览器时,发现了字段,并将报告错误。

  修改django中的views.py文件,以修改Views.py中相应API的实现功能,将响应头添加到访问 - 连锁 - 原始蛋白,并允许其他域传递AJAX请求数据:

  满足以下两个条件的要求。

  (1)请求方法是以下三种方法之一:

  (2)HTTP的标题信息不超过以下字段:

  非简单请求是复杂的请求。

  非简单请求CORS请求将在正式通信之前添加HTTP查询请求,称为“ Preflicht”请求。

  前检查请求是从服务器请求授权信息的选项请求。

  在成功响应前检查请求后,将发出真正的请求,并将携带真实的数据。

  JSONP是JSON带有Padding的标题。它是一个非官方协议,允许将脚本标签集成到服务器端的客户端,并通过JavaScript回调的形式实现Cross -domain访问(这只是JSONP的简单实现形式)。

  JSONP的实现步骤大致如下(请参阅来源中的文章)

  在请求期间,接口地址为SRC作为构建脚本标签。这样,当构建脚本标签时,最终SRC是接口返回的内容

  目前,只要浏览器定义了foo函数,该函数将立即调用。JSON数据作为参数被视为JavaScript对象,而不是字符串,因此避免使用JSON.PARSE的步骤。

  JSONP注意

  基于JSONP的实施原则,JSONP只能是“获取”请求,并且不能提出更复杂的帖子和其他请求,因此,当您遇到这种情况时,您必须引用)。

  如前所述,JSONP的实现原则,现在我们可以编写JS来实现JSONP函数。

  在正常情况下,我们希望可以动态地称呼此脚本标签,而不是在HTML中固定,因此它不灵活。

  我们可以通过页面的触发事件操作动态创建脚本标签,以便我们可以灵活地弹性地调用远程服务。例如:下面:以下:

  为了更灵活,将客户端定义的回调函数的上述函数名称传输到服务器,并且服务器将返回您定义的回调函数名称的方法。

  如上所述,jQuery框架还支持JSONP,该框架可以使用$ .getjson(url,[data],[callback])方法。

  与JS实施相比,我们不需要生成脚本标签,并且客户端无需自己定义回调函数。

  上述方法非常方便。我们不需要定义回调函数并指定回调函数名称。

  我们可以使用$ .ajax方法实现。如下所示:

  在最后一节中,JSONP:“回调”是定义存储回调函数的键的键。JSONPCALLBACK是回调函数的后端定义的方法名称。服务器可以填写数据并将数据返回到返回。

  但是,可以松开JSONPCALLBACK参数。jQuery将自动为过去定义一个随机名称,并且前端必须使用回调功能来处理相应的数据。使用jQuery可以轻松实现jsonp以供交叉域访问。

  这样,我们的交叉域处理即可完成所有请求。

  呢[y $ el]} b8ca)ou {)l 6f3wfd.png

  在Axios中的设置

  修改当前配置后,第一步将发生在交叉域中。目前,您需要将其设置在服务器端。

  (顺便说一句,谢谢您的背部伙伴Cheng Shao在这个寂寞的夜晚陪伴我)

  目前的情况是,只有前端与带有cookie的交叉域请求一致,而后端尚未达成协议。因此,将其设置在后台配置中。

  django中的设置配置。

  [图片上传失败...(Image-90D7C0-1556455798141)]]]]]]

  因为我想改变一些以前的需求,所以主管要求我学习Vue。花了很长时间才进入门,我不得不更改成熟的项目。这个困难仍然很困难。

  那些熟悉网站构建的人应该知道Vue是一个出色的前端框架,而Django是Python语言系统下的后端框架。尽管他们俩都可以编写一个完整的网站,但它们具有自己的焦点。速度很快,但是模板引擎附带的速度相对较弱,VUE是由数据驱动和组成的意识形态构建的。它是渲染页面中的第一个类。因此,随着Python的开发,可以开发网站。

  不同的框架如何组合?这导致了前端和后端分离的想法。后端仅提供接口,API和前端来调用这些接口以获取数据,然后将其渲染到HTML模板模板。

  在开发不同的框架时,最大的问题是交叉域。由于不同的框架,它们启用的端口号不同,即不同的数据源。由于安全性,无法直接访问它们。它是Django配置文件中的跨域许可证。使用Django的第三方软件包Django-Cors-neaders解决跨域问题

  在这种情况下,我们可以使通过VUE启动方法进行调试更加方便

  最终如何集成在一起?我们知道Django是通过指定模板和静态文件的路径来渲染的,因此我们需要打包VUE文件以生成index homepage和static文件,以便我们可以在django的默认文件夹中分别分别分开,或指定这两个文件。再次路径。

  返回 - 末端开发环境:Django 3.2.9

  前端开发环境:VUE3 + TS

  浏览器版本:Chrome(96.0.4664.45)

  问题:

  最近开发了一个新项目。前端使用Axios进行HTTP类包装。前后分离分开以进行API调试。登录后,发现随后的API调用能够识别cookie。

  尝试情况:

  1.用轴承设置的Axios设置,无效

  2.分析API请求和响应信息,并发现响应标题有警告信息

  3.认为,由于警报信息似乎对头部有反应,因此您可以考虑从Django开始。它确实找到了相关说明。设置session_cookie_samesite ='none'和session_cookie_secure = true = true之后,成功解决了问题。

  结论:以上是Django如何求解Django的相关内容所编写的主要CTO注释。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?