Django中的ajax细节

原代码

html 复制代码
<script>
    $(function () {
        // 根据id获取展示框
        var viewer = $3Dmol.createViewer("gldiv");
        var pdbModel, sdfModel;
        var colorpdb = '700080', colorsdf = '000F00';
        // 这里两个src表示文件路径
        var sdf = '../resources/sdf/99.sdf';
        var pdb = '../resources/pdb/4iiy.pdb';

        // 加载pdb和sdf文件 相对路径
        $.when($.get(pdb), $.get(sdf)).done(function (pdbData, sdfData) {
            pdbModel = viewer.addModel(pdbData[0], "pdb");
            sdfModel = viewer.addModel(sdfData[0], "sdf");

            viewer.setStyle({model: pdbModel}, {cartoon: {color: colorpdb}}); // 六进制颜色代码,不含透明度
            viewer.setStyle({model: sdfModel}, {stick: {color: colorsdf}});
            viewer.zoomTo();
            viewer.render();
        });
</script>

代码功能

这里想用3Dmol.js进行分子的3D渲染,通过改变sdf和pdb对应的值,来渲染不同的文件

那么在后端自然而然就想到,在服务器中存好对应文件后,保存对应文件路径并通过模版中的变量写法来改变这里的src的值


问题发现

后端处理无误的情况下前端仍无法正确显示对应结果

经过我路由调试,视图函数的返回结果,网页中请求的抓包,最终判断我后端处理已经正确

抓包得到的响应结果中,这里的sdf与pdb也修改为了对应后端给出的结果

然后单独访问服务器对应url的资源,发现可以得到正常返回,所以该路径无论从服务器层面还是后端角度都是正确的,但是我的文件无法得到正常渲染

起初还有一种可能,就是3Dmol.js的库文件由于网络问题没有被我正常响应拿到结果

但是反过头看网络的抓包请求,均返回200 OK,所以也排除


原因

通过查阅相关资料,回想起ajax本身是异步的,也就是说我对pdb和sdf改变之前,可能就已经执行了下面那些进行渲染的代码

解决

那么对应的方案就是一定要让渲染的操作在对sdf与pdb赋值之后再执行

也就是再多层嵌套.$ajax{....}

更改代码

html 复制代码
<script>
    $(function () {
        var viewer = $3Dmol.createViewer("gldiv");
        var pdbModel, sdfModel;
        var colorpdb = '700080', colorsdf = '000F00';
        var sdf = "{{ MEDIA_URL }}{{ sdf }}";
        var pdb = "{{ MEDIA_URL }}{{ pdb }}";

        // 使用$.ajax()代替$.get()
        $.ajax({
            url: pdb,
            success: function (pdbData) {
                pdbModel = viewer.addModel(pdbData, "pdb");
                viewer.setStyle({model: pdbModel}, {cartoon: {color: colorpdb}});
                // 在第一个文件加载完成后加载第二个文件
                $.ajax({
                    url: sdf,
                    success: function (sdfData) {
                        sdfModel = viewer.addModel(sdfData, "sdf");
                        viewer.setStyle({model: sdfModel}, {stick: {color: colorsdf}});
                        viewer.zoomTo();
                        viewer.render();
                    }
                });
            }
        });
    });
</script>
相关推荐
markfeng81 天前
Python+Django+H5+MySQL项目搭建
python·django
QQ4022054962 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
百锦再2 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
starlaky2 天前
Django入门笔记
笔记·django
QQ5110082852 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe2 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长2 天前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
B站_计算机毕业设计之家2 天前
电影知识图谱推荐问答系统 | Python Django系统 Neo4j MySQL Echarts 协同过滤 大数据 人工智能 毕业设计源码(建议收藏)✅
人工智能·python·机器学习·django·毕业设计·echarts·知识图谱