从零开始用 Flask 搭建一个网站(三)

news/2024/5/16 4:59:20/文章来源:https://blog.csdn.net/weixin_33912445/article/details/92057366

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

从零开始用 Flask 搭建一个网站(二) 介绍了有关于数据库的运用,接下来我们在完善一下数据在前端以及前端到后端之间的交互。本节涉及到前端,因此也会讲解一下 jinja2 模板、jQuery、ajax 等用法。

下面我们来创建两个界面,一个可以新建 channel,并显示,另一个可以创建 integration,并且可以绑定一个之前创建的 channel。

post2channel.html

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}{% block head %}    
{{ super() }}    
<link rel="stylesheet" href="{{ url_for('static', filename='css/post2channel.css') }}">    
<link rel="stylesheet" href="{{ url_for('static', filename='css/toastr.css') }}">    
<script type="text/javascript" src="{{ url_for('static', filename= 'js/jquery.min.js') }}"></script>    
<script type="text/javascript" src="{{ url_for('static', filename='js/toastr.js') }}"></script>    
<script type="text/javascript" src="{{ url_for ('static', filename='js/')}}"></script>
{% endblock %}{% block title %}极光宝盒-创建集成{% endblock %}
{% block navbar %}    
<div id="navigationbar"></div>    
{{ super() }}
{% endblock %}...

我们从第一行开始来讲解一下这个模板,第一句

{% extends "base.html" %}

从字面上可以明白这个模板继承了 base.html 模板,使用 {% %} 是 jinja2 模板的语法,表示语句块,还有一种分隔符 {{ }} ,表示变量,通常用来在模板上显示。接下来是

{% block head %}

可以看到也是比较容易理解的语法,block 后接一个 block name,表示一个块开始的声明,结束的时候用 {% end %} 即可。在块中可以使用普通的 HTML 语法。{{ super() }} 表示继承父模板的块声明,这里指继承 base.html 中声明的 head 块。接下来是 css 和 js 文件的引用。此页面使用了 toastr 来显示通知,类似于 Android 中的 Toast,有兴趣的可以了解一下它的详细用法。

接下来是HTML代码,有一个下拉输入框和按钮。

<ul id="content" class="dropdown-menu dropdown-menu-right">    {% for channel in channels %}        <li id="{{ channel }}" class="channel_class"><a>{{ channel }}</a></li>    {% endfor %}
</ul>

以上代码就是下拉输入框中的数据来源,用了一个for循环来遍历 channels 列表,并且用 li 包裹每个元素,这也是模板常见的用法。channels 是在视图函数中传过来的。

auth/views.py

@auth.route('/new/post_to_channel', methods=['GET'])
def post_to_channel():    developer = get_developer()    dev_key = developer.dev_key    channels = get_channel_list()    return render_template('auth/new/post2channel.html', **locals())

remder_template 的第二个参数表明,渲染这个 post2channel.html 页面的时候,把以上所有的变量都传递到页面中,这样就可以使用 {{ }} 模板语法拿到。接下来回到 post2channel.html, 看到<script></script>部分:

$('#create_integration_btn').click(function () {    var channel = $('#selected_channel').val();   console.log('create integration, channel: ' + channel);    if (channel != '') {        $.ajax({            type: "POST",            contentType: "application/json; charset=utf-8",            url: "../../v1/developers/{{ dev_key }}/integrations",            data: JSON.stringify({channel: channel}),            success: function (data) {                if (data != undefined) {                    if (data["token"]) {                       window.location.href = '/auth/manage/create_integration/' + data["integration_id"] + '/' + data["token"] + '/' + channel                    }                } else {                    toastr.error("服务器异常");                }            },            error: function (error) {                console.log(error);                toastr.error("创建失败");            },            dataType: "json"        })    }
})

这是创建集成按钮的逻辑,用 jQuery 的 ajax 发送 post 请求,以 json 格式将输入框中的 channel 值传到 url 表明的视图函数。这里的 url 是相对路径。在 ajax 中有 success 和 error 两个函数,分别是请求成功和失败的回调函数。下面看到这个请求的视图函数,我们来看看视图函数是如何处理从页面传过来的数据。

api_1_0/developers.py

# 添加一个集成,并返回 integration_id ,如果 channel 已存在,直接绑定该 channel, 否则新建一个 channel@api.route('/developers/<dev_key>/integrations', methods=['POST'])
def create_integrations(dev_key):
# 先判断一下传过来的 json 数据是否符合要求if not request.json or not 'channel' in request.json:    print("request json error")    abort(400)
#从数据库得到 developerdeveloper = Developer.query.filter_by(dev_key=dev_key).first()if developer is None:    print("developer not found")    abort(400)#以下省略...#最后返回相关数据return jsonify({'integration_id': new_integration_id,                'token': token.decode('utf-8')}), 201

以上代码创建成功后也返回了一个 json,这样在 success 的回调函数中就能得到这个数据,用于在跳转到其他界面的时候做一些初始化操作。即以下代码:

if (data != undefined) { if (data["token"]) { window.location.href = '/auth/manage/create_integration/' + data["integration_id"] + '/' + data["token"] + '/' + channel } 
}

这里将参数放到 url 中,调用了对应的视图函数:

auth/views.py

@auth.route('/manage/create_integration/<string:integration_id>/<string:token>/<string:channel>', methods=['GET', 'POST'])
def create_integration(integration_id, token, channel):    integration = Integration.query.filter_by(integration_id=integration_id).first()    channels = get_channel_list()    developer = get_developer()    dev_key = developer.dev_key    return render_template('auth/create.html', **locals())

可以看到上面的参数就是从 post2channel 页面传过来的,并且还从数据库中查询到对应的 integration,然后将相关数据传到 create.html,让后者渲染页面。

我们通过一个例子看到数据在前端和后端、前端之间的交互。总结一下,无非就是在前端页面中发送请求,然后在视图函数中操作数据库,并且返回相关数据,回调到前端页面中,最后在回调中调用另一个视图函数,在跳转页面时利用得到的数据渲染页面。一切就是这么简单,没什么黑魔法!源码在 github 上。下一节介绍一下 flask_oauthlib 的用法,学习一下如何使用 oath2 第三方授权登录以及调用提供方的相关 API。


作者:KenChoi - 极光

原文:从零开始用 Flask 搭建一个网站(三)

知乎专栏:极光日报

转载于:https://my.oschina.net/jpushtech/blog/879543

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_726039.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《网站设计 开发 维护 推广 从入门到精通》——导读

前言 互联网信息技术彻底改变了人们的生活和工作。越来越多的企业和个人建立起网站来宣传自己。人才市场上对网页制作和网站建设人员的需求大大增加&#xff0c;但是网站建设是一项综合性技能&#xff0c;包括网站策划、网页设计和动态网站的开发等几部分&#xff0c;真正完全懂…

如何让织梦网站内页中的文章显示浏览多少次 ?

织梦dedecms内容页调用点击量的方法&#xff1a;虽然我用织梦好几年了&#xff0c;也做了N多网站了&#xff0c;但是这么多网站中从来都没有用过内容页调用点击率的方法&#xff0c;这一点也很汗颜&#xff0c;虽然很简单&#xff0c;但是对大家应该也有帮助。也有朋友会说&…

[EntLib]微软企业库5.0 学习之路——第四步、使用缓存提高网站的性能(EntLib Caching)...

在前面的企业库学习之路里我分别使用了Data Access构建多数据库访问和使用Exception HandleLogging记录系统的异常。今天我来介绍下企业库中的Caching模块在本项目中如何应用。 首先先补习下企业库的Caching Application Block的相关知识&#xff1a; 1、四大缓存方式&#xff…

SEO终极算法(三),百度排名引流So easy

大家都知道做SEO要分析网站日志&#xff0c;要查看百度蜘蛛抓取网站页面的情况。我不知道大家有没有发现一个规律?百度蜘蛛会不定期的抓取网站所有页面的链接&#xff0c;不管是没有被收录的页面和还是已经被收录的页面&#xff0c;百度蜘蛛都会来抓取&#xff0c;不过有的页面…

Linux系统查看网站访问日志

日志地址 /www/wwwlogs/网站名称-access_log 下载到本地&#xff0c;改成txt文件 打开WPS&#xff0c;创建表格&#xff0c;导入数据&#xff0c;选择文件&#xff0c;然后点击下一步&#xff0c;直到选择文件类型时&#xff0c;选择分隔符号&#xff0c;下一步&#xff0c;把勾…

大型网站架构之百万PV网站架构案例

一、案例概述 本案例采用四层模式实现&#xff0c;主要分为前端反向代理、web层、数据库缓存层和数据库层。 前端反向代理采用主备模式web层采用群集模式数据库缓存层采用主备模式数据库层采用主从模式由于实验条件限制&#xff0c;本次实验共打开四台虚拟机&#xff0c;此处实…

用户登录界面(1.8版本--网站框架改进)

1.创建数据库db_user与表users 1 CREATE DATABASE db_user CHARACTER SET utf8;2 3 CREATE TABLE users (4 userid TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,5 username varchar(20),6 passwd varchar(20),7 email varchar(30),8 priority int9 ); 10…

《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境

《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境 文章最后会post上书本的笔记照片。 文章主要内容&#xff1a; 源码包程序LNMP动态网站架构 配置Mysql服务配置Nginx服务配置php服务搭建Discuz论坛选购服务器主机书本笔记源码包程序 在RPM和Yum出现之前&#xf…

5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案微信小程序篇(配置网站--网站配置上数据库)...

https://www.cnblogs.com/yangfengwu/p/11037653.html php和数据库打交道,这样整个网页就完美了,有了数据存储,交互,动态网页才完美 首先修改下php.ini 文件 告诉php当前的扩展库路径 扩展库--就是扩展的其它功能的库 这个就是扩展库文件夹,里面有很多功能性文件 就是增加这…

C#中利用JQuery实现视频网站的缩略图采集

最近有朋友想要采集优酷的视频标题和缩略图 (哈哈, 并非商业目的). 找到我帮忙, 考虑到有我刚刚发布的SpiderStudio, 我毫不犹豫的答应了. 首先在网页上视频的基本结构为: div.v- div.v-meta-title //标题- div.v-thumb / img //缩略图 对应的JQuery表达式为: $("div.v&q…

网站被劫持到其它网站如何解决

2019独角兽企业重金招聘Python工程师标准>>> 前段时间网站被黑了&#xff0c;从百度打开网站直接被劫持跳转到了cai票&#xff0c;du博网站上去&#xff0c;网站的首页index.html文件也被篡改成一些什么北京sai车&#xff0c;pk10&#xff0c;一些cai票的关键词内容…

没有网站,靠什么来吸引近9亿的互联网用户

2018年水果连锁企业百果园&#xff0c;其线上销售额突破20亿元、日订单量达6万单,光小程序用户数累计达到了1300万。 数据显示&#xff0c;以互联网起家的瑞幸咖啡在2018年的互联网市场占有率在30%左右&#xff0c;而作为咖啡巨头的星巴克互联网市场占有率仅10%左右。为什么会出…

Ajax_Apache访问资源文件的权限配置、资源存放路径配置、配置虚拟主机、动态网站静态网站区别...

1、配置资源的访问权限 修改配置文件&#xff1a;httpd.conf 文件 改完之后要重启 2、切换资源默认存放目录www 修改配置文件httpd.conf 文件中的存放目录 3、Apache是否能够同时支持多个站点 Apache能否支持通过不同的域名访问不同的站点 可以 做法&#xff1a;配置虚拟主机…

我的第一个发布到网上的程序,已经超过二十家网站收录了,呵呵,高兴

邮箱专家 1.3┊具备了文件拖放/自动搜索/自动解析等功能┊简体中文绿色免费版 软件大小&#xff1a;106 K热门等级&#xff1a; 更新时间&#xff1a;2008-08-21联 系 人&#xff1a;x_iayu163.com下载次数&#xff1a;450开 发 商&#xff1a; 界面预览&#xff1a;无软件类别…

python怎么测试一个网站的延迟_测量服务器的ping延迟-Python

I have a list of server IP addresses, I need to check if each one is online and how long the latency is. I havent found any straight forward ways of implementing this, and there seems to be a few problems in calculating latency accurately. Any ideas? 解决…

支付回调失败怎么处理_Thinkphp网站支付宝异步回调验签失败问题

php中文网最新课程每日17点准时技术干货分享手头一个项目&#xff0c;用到了支付宝手机网站支付&#xff0c;项目用tp做的&#xff0c;下载支付宝SDK后修改后调起正常&#xff0c;同步接口也可访问&#xff0c;但异步接口验签总是错误失败&#xff0c;fail&#xff0c;追踪到Ao…

最炫表白网站html5源码_(自适应手机版)响应式滚屏智能化物流设备类网站织梦模板 HTML5蓝色人工智能设备网站源码...

模板名称&#xff1a;(自适应手机版)响应式滚屏智能化物流设备类网站织梦模板 HTML5蓝色人工智能设备网站源码下载本套织梦模板采用织梦最新内核开发的模板&#xff0c;这款模板使用范围广&#xff0c;不仅仅局限于一类型的企业&#xff0c;物流设备、智能设备、人工智能类的网…

php冗余数据,WordPress网站提速优化之清理数据库冗余数据

最近小 C 发现数据库中有很多冗余数据&#xff0c;就想清理优化下数据库加快网站的运行速度&#xff0c;下面小 C 就教大家如何清理数据库表。PS&#xff1a;请注意看观看此文请认真&#xff0c;一定要先备份&#xff0c;备份&#xff0c;备份重要的事说三遍。备份后在执行 SQL…

laravel 开发的双语网站_2019年重庆市第十二届中等职业学校技能大赛网页前端开发项目教师培训成功举办...

点上方蓝字&#xff0c;欢迎关注我们&#xff01;2019年11月7日&#xff0c;重庆市第十二届中等职业学校技能大赛Web前端开发项目在重庆市南川隆化职业中学校成功举办&#xff01;本次培训由重庆市教育科学研究院主办&#xff0c;重庆市南川隆化职业中学校承办&#xff0c;成都…

说说大型高并发高负载网站的系统架构(更新)【转】

我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;又在MOP处理过大型社区猫扑大杂烩的架构升级等工作&#xff0c;同时自己接触和开发过不少大中型网站的模块&#xff0c;因此在大型网站应对高负载和并发的解决方案上有一些…