资讯专栏INFORMATION COLUMN

Flask Web Development —— 模板(中)

eternalshallow / 1556人阅读

摘要:示例使用的模板的指令通过从引用来实现模板的继承。上面的模板定义了三个,分别命名为和。同时返回相应错误的数字状态码。示例带有导航栏的基础应用程序模板这个模板中的块中只是一个名为的元素,它包含了在派生模板中定义的名为的空。

2、集成Twitter Bootstrap的Flask-Bootstrap

Bootstrap是Twitter的一个开源框架,提供用户交互组件来创建一个清新且有吸引力的web页面,并兼容所有现代web浏览器。

Bootstrap是一个客户端框架,服务端不直接参与。服务端需要做的就是提供HTML响应,引用层叠样式表(CSS)和JavaScript文件并通过HTML、CSS、和JavaScript代码来实例化需要的组件。模板是做这些的理想地方。

集成Bootstrap到应用程序最好的方式是在模板中做一些必要的改变。一个简单点的途径就是使用Flask-Bootstrap扩展去简化集成工作。可以通过pip来安装Flask-Bootstrap:

(venv) $ pip install flask-bootstrap

Flask扩展通常在应用程序实例被创建的时候初始化。示例3-4展示Flask-Bootstrap的初始化。

示例3-4. hello.py:Flask-Bootstrap初始化

from flask.ext.bootstrap import Bootstrap
# ...
bootstrap = Bootstrap(app)

和第二章的Flask-Script一样,Flask-Bootstrap从flask.ext命名空间导入并通过传递应用程序实例到构造函数来初始化。

一旦Flask-Bootstrap被初始化,一个包含所有Bootstrap文件的基础模板就可供应用程序使用了。这个模板利用Jinja2的模板继承,应用程序则可以扩展一个拥有通用页面结构,且包含Bootstrap导入的元素的基础模板。示例3-5展示作为派生模板的新版user.html

_示例3-5. templates/user.html: 使用Flask-Bootstrap的模板

{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block navbar %}





{% endblock %}

{% block content %}


{% endblock %}

Jinja2的extends指令通过从Flask-Bootstrap引用bootstrap/base.html来实现模板的继承。Flask-Bootstrap的基础模板提供一个包含Bootstrap CSS和JavaScript文件的web页面骨架。

基础模板定义了一些可以被派生模板重写的blockblockendblock指令定义了被添加到基础模板中block的内容。

上面的user.html模板定义了三个block,分别命名为titlenavbarcontent。基础模板里的这些block输出派生模板定义的内容。title块比较简单;它的内容将出现在</b>标签内,然后被渲染在HTML文档的头部 。<b>navbar</b>和<b>content</b>块则是为页面保留的导航栏和主内容。</p> <p>在这个模板中,<b>navbar</b>块使用Bootstrap组件定义了一个简单的导航栏。<b>content</b>块有个名为<b>container</b>的<b><div></b>,里面嵌套了名为<b>page-header</b>的<b><div></b>。图3-1展示这些操作后应用程序长成啥样了。</p> <pre> <p>建议:如果你有克隆在GitHub上的应用程序,你现在可以运行<b>git checkout 3b</b>来切换到这个版本的应用程序。Bootstrap官方文档 是一个非常强大的学习资料,完全可以复制粘贴使用那些示例。</p> </pre> <p><script type="text/javascript">showImg("http://young-py.github.io/imgs/flask3-02.png");</script></p> <p><em>图片3-1. Twitter Bootstrap模板</em></p> <p>Flask-Bootstrap的<b>base.html</b>模板定义了一些其他可供派生模板使用的<b>block</b>。表格3-2展示了完整的可用<b>block</b>列表。</p> <p><em>表格3-2. Flask-Bootstrap基础模板中的block</em></p> <p><script type="text/javascript">showImg("http://young-py.github.io/imgs/flask3-03.png");</script></p> <p>表格3-2中的许多块用于Flask-Bootstrap自身,所以直接重写它们会引发问题。例如,<b>styles</b>和<b>scripts</b>块是Bootstrap定义文件的地方。如果应用程序需要新增自己的内容到已经有一些内容的块中,则必须使用Jinja2的<b>super()</b>。例如,如何在派生模板中写<b>scripts</b>块,来给文档增加新的JavaScript文件:</p> <pre>{% block scripts %} {{ super() }} <script type="text/javascript" src="my-script.js"></script> {% endblock %} </pre> <b>3、自定义错误页面</b> <p>当你输入错误路径在你的浏览器地址栏,你会得到404错误代码页面。目前的错误页面很普通也没有吸引力,且没有一致的使用Bootstrap页面。</p> <p>Flask允许应用程序自定义基于模板的错误页面,就像常规的路由。两个最常见的错误代码,404是在客户端请求的页面或路径不存在的时候触发;500是当存在未处理的异常时触发。示例3-6展示如何为这两个错误提供自定义处理。</p> <p><em>示例3-6. hello.py:自定义错误页面</em></p> <pre>@app.errorhandler(404) def page_not_found(e): return render_template("404.html"), 404 @app.errorhandler(500) def internal_server_error(e): return render_template("500.html"), 500 </pre> <p>错误处理返回响应,和视图函数一样。同时返回相应错误的数字状态码。</p> <p>在错误处理中引用的模板需要自己去写。这些模板需要和常规的页面一样的布局,所以在这个示例中需要导航栏和页面头部显示错误信息。</p> <p>编写这些模板的简单方式是复制<b>templates/user.html</b>到<b>templates/404.html</b>和<b>templates/500.html</b>,然后改变这两个新文件的页面头部元素来给出相应的错误信息,但这会产生很多副本。</p> <p>Jinja2的模板继承可以帮助我们解决这个问题。Flask-Bootstrap提供了一个带有基本布局页面的基础模板,应用程序可以定义自己的、带有完整页面布局的基础模板,包括导航栏和定义在派生模板中的页面内容。示例3-7展示了<b>templates/base.html</b>,它是一个继承自<b>bootstrap/base.html</b>的新模板且定义了导航栏,但对于其他模板则是一个基础模板,例如<b>templates/user.html</b>、<b>templates/404.html</b>和<b>templates/500.html</b>。</p> <p>_示例3-7. templates/base.html:带有导航栏的基础应用程序模板</p> <pre>{% extends "bootstrap/base.html" %} {% block title %}Flasky{% endblock %} {% block navbar %} <div class="navbar navbar-inverse" role="navigation"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/">Flasky</a> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li><a href="/">Home</a></li> </ul> </div> </div> </div> {% endblock %} {% block content %} <div class="container"> {% block page_content %}{% endblock %} </div> {% endblock %} </pre> <p>这个模板中的<b>content</b>块中只是一个名为<b>container</b>的<b><div></b>元素,它包含了在派生模板中定义的名为<b>page_content</b>的空block。</p> <p>应用程序的模板将从该模板继承而不是直接从Flask-Bootstrap继承。示例3-8展示了从<b>templates/base.html</b>继承来构造一个自定义404错误页面是如此的简单。</p> <p><em>示例3-8. <b>templates/404.html</b>:使用模板继承自定义404错误页面</em></p> <pre>{% extends "base.html" %} {% block title %}Flasky - Page Not Found{% endblock %} {% block page_content %} <div class="page-header"> <h1>Not Found</h1> </div> {% endblock %} </pre> <p>图片3-2展示在浏览器中错误页面是怎样的。</p> <p><script type="text/javascript">showImg("http://young-py.github.io/imgs/flask3-04.png");</script></p> <p><em>图片3-2. 自定义404错误页面</em></p> <p>现在<b>templates/user.html</b>模板可以通过继承基础模板来简化它,就像示例3-9展示的这样。</p> <p><em>示例3-9. templates/user.html:使用模板继承简化页面模板</em></p> <pre>{% extends "base.html" %} {% block title %}Flasky{% endblock %} {% block page_content %} <div class="page-header"> <h1>Hello, {{ name }}!</h1> </div> {% endblock %} </pre> <pre> <p>建议:如果你有克隆在GitHub上的应用程序,你现在可以运行<b>git checkout 3c</b>来切换到这个版本的应用程序。</p> </pre> </div> <div class="mt-64 tags-seach" > <div class="tags-info"> <a style="width:120px;" title="GPU云服务器" href="https://www.ucloud.cn/site/product/gpu.html">GPU云服务器</a> <a style="width:120px;" title="云服务器" href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo">云服务器</a> <a style="width:120px;" title="web-development" href="https://www.ucloud.cn/yun/tag/web-development/">web-development</a> <a style="width:120px;" title="Flask_Web" href="https://www.ucloud.cn/yun/tag/Flask_Web/">Flask_Web</a> <a style="width:120px;" title="web模板" href="https://www.ucloud.cn/yun/tag/webmoban/">web模板</a> <a style="width:120px;" title="Development" href="https://www.ucloud.cn/yun/tag/Development/">Development</a> </div> </div> <div class="entry-copyright mb-30"> <p class="mb-15"> 文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。</p> <p>转载请注明本文地址:https://www.ucloud.cn/yun/37433.html</p> </div> <ul class="pre-next-page"> <li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/37432.html">上一篇:[零基础学python]通过Python连接数据库</a></li> <li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/37434.html">下一篇:flask 跨域访问装饰器实现</a></li> </ul> </div> <div class="about_topicone-mid"> <h3 class="top-com-title mb-0"><span data-id="0">相关文章</span></h3> <ul class="com_white-left-mid atricle-list-box"> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/37454.html"><b><em>Flask</em> <em>Web</em> <em>Development</em> —— <em>Web</em>表单(上)</b></a></h2> <p class="ellipsis2 good">摘要:每个表单域都可以连接到一个或多个是一个用于检查用户提交的输入是否合法的函数。表单域构造函数的第一个参数是一个,在渲染表单到时会使用。验证确保提交的表单域不为空。表单域验证都是直接从包中导入。表格展示了一组支持的标准表单域。 第二章中介绍的request对象公开了所有客户端发送的请求信息。特别是request.form可以访问POST请求提交的表单数据。 尽管Flask的request...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-336.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/03/small_000000336.jpg" alt=""><span class="layui-hide64">CODING</span></a> <time datetime="">2019-07-24 17:49</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/37461.html"><b><em>Flask</em> <em>Web</em> <em>Development</em> —— <em>模板</em>(下)</b></a></h2> <p class="ellipsis2 good">摘要:如果路由重组,模板中的链接将被打断而变得无法访问。静态文件应用程序不仅仅是由代码和模板组成。当服务器收到来自之前示例的,它会产生一个响应包含的文件内容。一个优雅的解决方案是允许服务器只发送时间给浏览器,由浏览器转为当地时间并渲染。 4、链接 任何应用程序都有多个路由,必然需要包含链接来连接不同的页面,例如导航栏。 在模板中,对于简单的路由直接写URLs做链接是非常琐碎麻烦的,而给带...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-697.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/06/small_000000697.jpg" alt=""><span class="layui-hide64">raoyi</span></a> <time datetime="">2019-07-24 17:49</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/37435.html"><b><em>Flask</em> <em>Web</em> <em>Development</em> —— <em>模板</em>(上)</b></a></h2> <p class="ellipsis2 good">摘要:用真实的值替换变量并返回最终响应字符串,这个过程称为渲染。示例展示模板实现该响应。控制结构提供一些控制结构用于改变模板流。这个示例展示如何使用循环做到这些同样支持宏,这和代码中的函数很像。 写代码最关键的是要易于维护且结构清晰整洁。目前为止,你看到的例子都过于简单从而没有做这方面的要求。Flask视图函数希望将两个应该完全独立的任务一并处理,两个任务有两种代码,一并处理势必会引发问题。...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-654.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/06/small_000000654.jpg" alt=""><span class="layui-hide64">fizz</span></a> <time datetime="">2019-07-24 17:47</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/45324.html"><b><em>Flask</em> <em>Web</em> <em>Development</em> —— Email</b></a></h2> <p class="ellipsis2 good">摘要:函数携带目的地址主题邮件体模板和一组关键字参数。许多扩展操作是在假设有活动的应用程序和请求上下文的情况下进行的。但是当函数在一个不同的线程上执行,应用程序上下文需要人为地创建使用。例如,执行函数可以将邮件发送到的任务队列中。 许多类型的应用程序都会在某些事件发生的时候通知用户,常用的沟通方法就是电子邮件。尽管在Flask应用程序中,可以使用Python标准库中的smtplib包来发送电...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-999.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/09/small_000000999.jpg" alt=""><span class="layui-hide64">SKYZACK</span></a> <time datetime="">2019-07-31 11:35</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/37475.html"><b><em>Flask</em> <em>Web</em> <em>Development</em> —— <em>Web</em>表单(下)</b></a></h2> <p class="ellipsis2 good">摘要:局部变量用于保存从表单中接收到的名字,初始化时变量为。在语句中,这个名字被赋值给局部变量且表单域的数据属性通过赋值为空字符串而被清除。示例重定向和用户会话在上一个版本中,局部变量用于保存用户在表单中输入的姓名。 4、视图函数中的表单操作 在新版本的hello.py中,index()视图函数渲染表单并接收其数据。示例4-4展示更新后的index()视图函数。 示例4-4. hello...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-1624.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/16/small_000001624.jpg" alt=""><span class="layui-hide64">yeooo</span></a> <time datetime="">2019-07-24 17:51</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> </ul> </div> <div class="topicone-box-wangeditor"> <h3 class="top-com-title mb-64"><span>发表评论</span></h3> <div class="xcp-publish-main flex_box_zd"> <div class="unlogin-pinglun-box"> <a href="javascript:login()" class="grad">登陆后可评论</a> </div> </div> </div> <div class="site-box-content"> <div class="site-content-title"> <h3 class="top-com-title mb-64"><span>0条评论</span></h3> </div> <div class="pages"></ul></div> </div> </div> <div class="layui-col-md4 layui-col-lg3 com_white-right site-wrap-right"> <div class=""> <div class="com_layuiright-box user-msgbox"> <a href="https://www.ucloud.cn/yun/u-1113.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/11/small_000001113.jpg" alt=""></a> <h3><a href="https://www.ucloud.cn/yun/u-1113.html" rel="nofollow">eternalshallow</a></h3> <h6>男<span>|</span>高级讲师</h6> <div class="flex_box_zd user-msgbox-atten"> <a href="javascript:attentto_user(1113)" id="attenttouser_1113" class="grad follow-btn notfollow attention">我要关注</a> <a href="javascript:login()" title="发私信" >我要私信</a> </div> <div class="user-msgbox-list flex_box_zd"> <h3 class="hpf">TA的文章</h3> <a href="https://www.ucloud.cn/yun/ut-1113.html" class="box_hxjz">阅读更多</a> </div> <ul class="user-msgbox-ul"> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/121442.html">如何提交百度新闻源?百度新闻源申请方法步骤</a></h3> <p>阅读 1399<span>·</span>2021-09-28 09:44</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/121405.html">程序员年纪大了以后都去了哪里</a></h3> <p>阅读 2480<span>·</span>2021-09-28 09:36</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/119503.html">NXP RT1064学习笔记(一)— 开发环境</a></h3> <p>阅读 1027<span>·</span>2021-09-08 09:35</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112744.html">css总结</a></h3> <p>阅读 1966<span>·</span>2019-08-29 13:50</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112641.html">如何使用Flexbox和CSS Grid,实现高效布局</a></h3> <p>阅读 790<span>·</span>2019-08-29 13:29</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112475.html">史上前端面试最全问答(附答案)</a></h3> <p>阅读 1104<span>·</span>2019-08-29 13:15</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112301.html">前端面试题2017(篇幅长,附答案)</a></h3> <p>阅读 1705<span>·</span>2019-08-29 13:00</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/110072.html">巧用命令行工具UCloud CLI,轻量操作API管理云资源</a></h3> <p>阅读 2954<span>·</span>2019-08-26 16:16</p></li> </ul> </div> <!-- 文章详情右侧广告--> <div class="com_layuiright-box"> <h6 class="top-com-title"><span>最新活动</span></h6> <div class="com_adbox"> <div class="layui-carousel" id="right-item"> <div carousel-item> <div> <a href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240625/2rTjEHmi.png" alt="云服务器"> </a> </div> <div> <a href="https://www.ucloud.cn/site/product/gpu.html" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240807/7NjZjdrd.png" alt="GPU云服务器"> </a> </div> </div> </div> </div> <!-- banner结束 --> <div class="adhtml"> </div> <script> $(function(){ $.ajax({ type: "GET", url:"https://www.ucloud.cn/yun/ad/getad/1.html", cache: false, success: function(text){ $(".adhtml").html(text); } }); }) </script> </div> </div> </div> </div> </div> </section> <!-- wap拉出按钮 --> <div class="site-tree-mobile layui-hide"> <i class="layui-icon layui-icon-spread-left"></i> </div> <!-- wap遮罩层 --> <div class="site-mobile-shade"></div> <!--付费阅读 --> <div id="payread"> <div class="layui-form-item">阅读需要支付1元查看</div> <div class="layui-form-item"><button class="btn-right">支付并查看</button></div> </div> <script> var prei=0; $(".site-seo-depict pre").each(function(){ var html=$(this).html().replace("<code>","").replace("</code>","").replace('<code class="javascript hljs" codemark="1">',''); $(this).attr('data-clipboard-text',html).attr("id","pre"+prei); $(this).html("").append("<code>"+html+"</code>"); prei++; }) $(".site-seo-depict img").each(function(){ if($(this).attr("src").indexOf('data:image/svg+xml')!= -1){ $(this).remove(); } }) $("LINK[href*='style-49037e4d27.css']").remove(); $("LINK[href*='markdown_views-d7a94ec6ab.css']").remove(); layui.use(['jquery', 'layer','code'], function(){ $("pre").attr("class","layui-code"); $("pre").attr("lay-title",""); $("pre").attr("lay-skin",""); layui.code(); $(".layui-code-h3 a").attr("class","copycode").html("复制代码 ").attr("onclick","copycode(this)"); }); function copycode(target){ var id=$(target).parent().parent().attr("id"); var clipboard = new ClipboardJS("#"+id); clipboard.on('success', function(e) { e.clearSelection(); alert("复制成功") }); clipboard.on('error', function(e) { alert("复制失败") }); } //$(".site-seo-depict").html($(".site-seo-depict").html().slice(0, -5)); </script> <link rel="stylesheet" type="text/css" href="https://www.ucloud.cn/yun/static/js/neweditor/code/styles/tomorrow-night-eighties.css"> <script src="https://www.ucloud.cn/yun/static/js/neweditor/code/highlight.pack.js" type="text/javascript"></script> <script src="https://www.ucloud.cn/yun/static/js/clipboard.js"></script> <script>hljs.initHighlightingOnLoad();</script> <script> function setcode(){ var _html=''; document.querySelectorAll('pre code').forEach((block) => { var _tmptext=$.trim($(block).text()); if(_tmptext!=''){ _html=_html+_tmptext; console.log(_html); } }); } </script> <script> function payread(){ layer.open({ type: 1, title:"付费阅读", shadeClose: true, content: $('#payread') }); } // 举报 function jupao_tip(){ layer.open({ type: 1, title:false, shadeClose: true, content: $('#jubao') }); } $(".getcommentlist").click(function(){ var _id=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); $("#articlecommentlist"+_id).toggleClass("hide"); var flag=$("#articlecommentlist"+_id).attr("dataflag"); if(flag==1){ flag=0; }else{ flag=1; //加载评论 loadarticlecommentlist(_id,_tid); } $("#articlecommentlist"+_id).attr("dataflag",flag); }) $(".add-comment-btn").click(function(){ var _id=$(this).attr("dataid"); $(".formcomment"+_id).toggleClass("hide"); }) $(".btn-sendartcomment").click(function(){ var _aid=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); var _content=$.trim($(".commenttext"+_aid).val()); if(_content==''){ alert("评论内容不能为空"); return false; } var touid=$("#btnsendcomment"+_aid).attr("touid"); if(touid==null){ touid=0; } addarticlecomment(_tid,_aid,_content,touid); }) $(".button_agree").click(function(){ var supportobj = $(this); var tid = $(this).attr("id"); $.ajax({ type: "GET", url:"https://www.ucloud.cn/yun/index.php?topic/ajaxhassupport/" + tid, cache: false, success: function(hassupport){ if (hassupport != '1'){ $.ajax({ type: "GET", cache:false, url: "https://www.ucloud.cn/yun/index.php?topic/ajaxaddsupport/" + tid, success: function(comments) { supportobj.find("span").html(comments+"人赞"); } }); }else{ alert("您已经赞过"); } } }); }); function attenquestion(_tid,_rs){ $.ajax({ //提交数据的类型 POST GET type:"POST", //提交的网址 url:"https://www.ucloud.cn/yun/favorite/topicadd.html", //提交的数据 data:{tid:_tid,rs:_rs}, //返回数据的格式 datatype: "json",//"xml", "html", "script", "json", "jsonp", "text". //在请求之前调用的函数 beforeSend:function(){}, //成功返回之后调用的函数 success:function(data){ var data=eval("("+data+")"); console.log(data) if(data.code==2000){ layer.msg(data.msg,function(){ if(data.rs==1){ //取消收藏 $(".layui-layer-tips").attr("data-tips","收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart-o"></i>'); } if(data.rs==0){ //收藏成功 $(".layui-layer-tips").attr("data-tips","已收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart"></i>') } }) }else{ layer.msg(data.msg) } } , //调用执行后调用的函数 complete: function(XMLHttpRequest, textStatus){ postadopt=true; }, //调用出错执行的函数 error: function(){ //请求出错处理 postadopt=false; } }); } </script> <footer> <div class="layui-container"> <div class="flex_box_zd"> <div class="left-footer"> <h6><a href="https://www.ucloud.cn/"><img src="https://www.ucloud.cn/yun/static/theme/ukd//images/logo.png" alt="UCloud (优刻得科技股份有限公司)"></a></h6> <p>UCloud (优刻得科技股份有限公司)是中立、安全的云计算服务平台,坚持中立,不涉足客户业务领域。公司自主研发IaaS、PaaS、大数据流通平台、AI服务平台等一系列云计算产品,并深入了解互联网、传统企业在不同场景下的业务需求,提供公有云、混合云、私有云、专有云在内的综合性行业解决方案。</p> </div> <div class="right-footer layui-hidemd"> <ul class="flex_box_zd"> <li> <h6>UCloud与云服务</h6> <p><a href="https://www.ucloud.cn/site/about/intro/">公司介绍</a></p> <p><a href="https://zhaopin.ucloud.cn/" >加入我们</a></p> <p><a href="https://www.ucloud.cn/site/ucan/onlineclass/">UCan线上公开课</a></p> <p><a href="https://www.ucloud.cn/site/solutions.html" >行业解决方案</a></p> <p><a href="https://www.ucloud.cn/site/pro-notice/">产品动态</a></p> </li> <li> <h6>友情链接</h6> <p><a href="https://www.compshare.cn/?ytag=seo">GPU算力平台</a></p> <p><a href="https://www.ucloudstack.com/?ytag=seo">UCloud私有云</a></p> <p><a href="https://www.surfercloud.com/">SurferCloud</a></p> <p><a href="https://www.uwin-link.com/">工厂仿真软件</a></p> <p><a href="https://pinex.it/">Pinex</a></p> <p><a href="https://www.picpik.ai/zh">AI绘画</a></p> </li> <li> <h6>社区栏目</h6> <p><a href="https://www.ucloud.cn/yun/column/index.html">专栏文章</a></p> <p><a href="https://www.ucloud.cn/yun/udata/">专题地图</a></p> </li> <li> <h6>常见问题</h6> <p><a href="https://www.ucloud.cn/site/ucsafe/notice.html" >安全中心</a></p> <p><a href="https://www.ucloud.cn/site/about/news/recent/" >新闻动态</a></p> <p><a href="https://www.ucloud.cn/site/about/news/report/">媒体动态</a></p> <p><a href="https://www.ucloud.cn/site/cases.html">客户案例</a></p> <p><a href="https://www.ucloud.cn/site/notice/">公告</a></p> </li> <li> <span><img src="https://static.ucloud.cn/7a4b6983f4b94bcb97380adc5d073865.png" alt="优刻得"></span> <p>扫扫了解更多</p></div> </div> <div class="copyright">Copyright © 2012-2023 UCloud 优刻得科技股份有限公司<i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/">沪公网安备 31011002000058号</a><i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/"></a> 沪ICP备12020087号-3</a><i>|</i> <script type="text/javascript" src="https://gyfk12.kuaishang.cn/bs/ks.j?cI=197688&fI=125915" charset="utf-8"></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?290c2650b305fc9fff0dbdcafe48b59d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-DZSMXQ3P9N"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-DZSMXQ3P9N'); </script> <script> (function(){ var el = document.createElement("script"); el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?99f50ea166557aed914eb4a66a7a70a4709cbb98a54ecb576877d99556fb4bfc3d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a"; el.id = "ttzz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(el, s); })(window) </script></div> </div> </footer> </body> <script src="https://www.ucloud.cn/yun/static/theme/ukd/js/common.js"></script> <<script type="text/javascript"> $(".site-seo-depict *,.site-content-answer-body *,.site-body-depict *").css("max-width","100%"); </script> </html>