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

news/2024/4/27 21:27:39/文章来源:https://blog.csdn.net/weixin_33980459/article/details/89050836

从零开始用 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 - 极光( JPush 为极光团队账号,欢迎关注)

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

知乎专栏:极光日报

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

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

相关文章

LNMP部署网站 访问php文件 404

今天在一个新的服务器上部署网站&#xff0c;访问php文件&#xff0c;竟然出现404服务器是腾讯云的免费的服务器Centos 7.2 php7.1.7 nginx1.12.1安装的是lnmp一键安装包&#xff0c;没有使用编译的方式安装。安装完后&#xff0c;添加配置文件在 /usr/local/nginx/conf/vhos…

ios将网站添加到主屏幕_将启动屏幕添加到iOS应用

ios将网站添加到主屏幕Do we really need a launch screen? Well, I would say launch screens are a way of making a positive vibe even before a user starts to use the app. So, having simple and clean launch screen is important for a winning app.我们真的需要启动…

用Vue.js搭建一个小说阅读网站

目录 1.简介 2.如何使用vue.js 3.部署api服务器 4.vue.js路由配置 5.实现页面加载数据 6.测试vue项目 7.在正式环境部署 8.Vue前端代码下载 1.简介 这是一个使用vue.js mint-ui .net core api的小说网站。 最近在学习vue.js&#xff0c;而抛开实践的学习都是在装逼&#xff0…

解决访问github等网站慢或下载失败的问题

1.打开码云&#xff08;当然不是福报&#xff09;https://gitee.com/并注册登录 2.创建仓库 3.在新建仓库页选择 “导入已有仓库” 4.复制你需要下载的git链接&#xff0c;如https://github.com/lehaifeng/T-GCN.gi放到导入已有仓库中 5.点击创建&#xff0c;然后下载 下载z…

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性&#xff08;Avaliability&#xff09;描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间&#xff08;故障时间&#xff09;故障修复时间点-故障发现&#xff08;报告&#xff09;时间点…

FLEX经典网站

如果你在寻找一些关于FLEX的信息&#xff0c;比如教程&#xff0c;提示&#xff0c;源码&#xff0c;实例&#xff0c;这篇文章正适合你.我选择了一些最好的FLEX网站&#xff0c;可以帮助你改进你的FLEX技术&#xff0c;获得FLEX的相关信息 1 - SitePoint 2 - Visual Build…

服务器网站主机头设置及域名DNS解析

服务器网站主机头设置及域名DNS解析 在网站构建这个版块发文章我是最没有资格的&#xff01; 在服务器架设方面我也没有丝毫经验&#xff01; 今天因为个人原因想重架个博客系统。。以前都是Macopad帮忙去服务器上的主机头的、我只会在域名服务提供商那里做DNS解析&#xff01;…

手机仿真器 上WAP网站

使用vs2005自带的手机仿真器时&#xff0c;往往会遇到连接不到网络的问题&#xff0c;这样就使得仿真器失去了他应有的作用。 网上很多WAP模拟器并不好用&#xff0c;也不太直观。于是研究了一下这个仿真器。感觉效果还行。下面是对网易WAP网站的访问&#xff0c;先贴个图。 使…

SEO: SEO工具,关键字分析工具 流量分析工具

SEO 很大程度上是关键字的优化&#xff0c;君不见不少 SEO 网站&#xff08;例如 WordTracker&#xff09; 都是靠关键字分析赚钱&#xff1f; 要钱的互联网产品我没有多大的兴趣&#xff0c;因为凡是要钱的互联网产品&#xff0c;基本上都有免费的盗版品或者替代品。 SEO 嘛&…

读《高性能网站建设指南》有感

这本书最大的特点是把管理人员和技术人员从传统的思维模式中解放出来&#xff0c;对于大多数管理人员和技术人员来说当谈到高性能网站和性能瓶颈时&#xff0c;总是习惯从系统硬件、网络、数据库、中间件、系统架构等方面去思考问题&#xff0c;诚然这些是至关重要的&#xff0…

移动端网站爬坑记_(3)DOMReady的实现及微信端reload页面解决方案

前言 两个小问题的解决方案 问题1 : DOMReady的实现 刚好有一个页面是注册成功的,就单单一个成功图片和文字描述和下载按钮. 由于临时需要增加一个倒计时重定向到下载页面 想了想原生有这么个参数就直接拿来用了,兼容性非常不错,移动端基本清一色的绿色, PC端支持也不错.IE9…

2010年汽车网络广告及网站季度流量监测专题

一、研究背景&#xff1a;汽车网络营销繁荣 2000年以来中国汽车进入高速发展期&#xff0c;产销量均出现井喷。2009年下半年到2010年&#xff0c;随着金融危机的影响逐渐消弭&#xff0c;汽车广告主的广告投放预算回升。 互联网的高速发展和汽车产业在中国的持续繁荣&#xff0…

10个有用的网站访问分析工具

几乎所有的网站,不论是门户网站还是个人博客,都少不了一些网站访问分析,最简单的就是一个计数器!这对于分析网站的访问人群等等指数具有十分重要的意义,对于广告的投放也十分重要! 下面是10个常用的网站分析工具! goingup! Clicky Google Analytics W3Counter Woopra W3Perl Pi…

021 DNS qi pian与DY网站

目录&#xff1a;审核过不了&#xff0c;无赖&#xff0c;只能采用长截图方式#####################################################长图二&#xff1a;

LAMP系列:构建httpd网站服务器

LAMP系列文章列表&#xff1a;LAMP系列&#xff1a;构建httpd网站服务器LAMP系列&#xff1a;基于域名的虚拟WEB主机------------------------------------------------------------- 前言&#xff1a; 在Interface网络环境中&#xff0c;Web服务无疑是最为流行的应用系统之一。…

那些带给我们强烈视觉冲击的 JavaScript 特效网站

关于 HTML5 和 Flash 之间的战争&#xff0c;网上讨论的文章很多很多&#xff0c;尽管 HTML5 还有很长的路要走&#xff0c;但 Flash 正在走下坡路是不争的事实。以前效果精美的 Flash 网站非常流行&#xff0c;如今已经很少见到了。借助 JavaScript &#xff0c;使用纯HTML/C…

JAVA学习网站收集

java学习网站收集 发布时间&#xff1a;2006.04.30 06:36 来源&#xff1a;月光软件站 作者&#xff1a;<font colorred>转的别人写的文章&#xff1a;</font>好的Java方面的编程网站&#xff1a; CSDN论坛 http://www.csdn.net/ ; 中国最有名的技术论坛&a…

前后端分离的思考 - 网站URL设计

2019独角兽企业重金招聘Python工程师标准>>> 最近在开发新项目,总是希望尽善尽美,让以后的维护轻松一点.基于前后端分离的模式进行开发,所有的浏览器url都由前端处理后转发发给后端,这里前端就要设计一些友好的url. 一开始没有注意这方面,开发完将近两个模块后,突然…

在PC上测试移动端网站和模拟手机浏览器的5大方法

2019独角兽企业重金招聘Python工程师标准>>> 最近公司要开发网站的移动版&#xff0c;让我准备准备知识&#xff0c;话说本人开发移动网站的经验还真不多&#xff0c;最悲剧的事情就是我的手机是个经典的诺基亚&#xff0c;而且公司还不给配手机&#xff0c;这是有多…

Android-好的学习网站或者博客

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0c;http://blog.csdn.net/liuhe688/article/details/6733407 讲的很基础&#xff0c;还会配有很多实例&#xff0c;很详细 转载于:https://my.oschina.net/u/1376153/blog/355129