Web项目开发过程中,实现页面局部刷新和实时数据更新是一项常见的需求。Ajax(Asynchronous JavaScript and XML)技术为此提供了完美的解决方案,它能在不重新加载整个页面的情况下,通过JavaScript发送异步HTTP请求,获取服务器端数据并更新页面内容。本文将以Python Flask框架为例,介绍如何利用Ajax实现页面的一步刷新,并附带具体代码示例。
首先,我们需要在Flask后端设置一个处理Ajax请求的路由和视图函数,该函数返回需要更新的数据:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/get_updates', methods=['GET'])
def get_updates():
# 假设此处是从数据库或其它来源获取最新数据
latest_data = fetch_latest_data()
return jsonify(latest_data)
在前端HTML中,我们需要一个元素来展示从服务器获取的数据,并编写JavaScript脚本来发起Ajax请求:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
function updateData() {
$.ajax({
url: '/get_updates',
type: 'GET',
success: function(response) {
// 更新页面元素
$('#data-display').html(response.some_field);
},
error: function(xhr, status, error) {
console.error('Failed to load data:', error);
}
});
}
// 初始加载
updateData();
// 定时刷新(例如每5秒一次)
setInterval(updateData, 5000);
});
</script>
</head>
<body>
<div id="data-display"></div>
</body>
</html>
上述代码中,我们使用了jQuery库简化Ajax请求的处理。$.ajax函数用于发送GET请求到’/get_updates’路由,当请求成功时,服务器返回的JSON数据会被用来更新页面上指定的HTML元素。
在实际应用场景中,除了定期刷新数据外,还可以根据特定事件触发Ajax请求,比如用户点击按钮、滚动页面等:
// 假设有一个按钮,点击时获取更新
$('#refresh-btn').click(function() {
updateData();
});
通过整合Flask后端与前端Ajax技术,我们可以轻松实现Web页面的实时刷新与局部更新,大大提升了用户体验和应用的响应速度。
关注我,手把手带你快速入门Python Web编程!
页编程之自动刷新。
各位同学好,今天我们来分享一下如何设置网页自动刷新和延时跳转。我们都知道,在浏览器中点击刷新按钮或者按下F5键可以刷新页面,但在编程中有时需要自动刷新页面,加载最新的数据,无需用户参与。这就是我们今天要讲的内容。
接下来让我们来看看效果如何。
·首先,在页面上添加了一个滚动字幕和一张GIF动画,用于展示页面的刷新状态。
·现在可以看到,每隔3秒自动刷新一次,每当刷新时,字幕会回到初始位置,动画也会重新播放。
·如果不明显,可以看到鼠标指到的位置会不停地触发刷新按钮,效果已经很明显了。
现在让我们来看看实现代码。自动刷新使用了meta标签的http-equiv属性,值为referesh,表示自动刷新。设置了content属性,在内容中填写秒数,即每隔多少秒自动刷新页面。如果设置为3,则每隔3秒自动刷新页面,非常简单。
·延时跳转的实现也很简单。刚才已经将Content属性设置为3,现在只需要指定要跳转到的URL。它的写法是在3后面加上一个英文分号,然后加上url等于要跳转到的地址。在这里,我们跳转到新浪首页,例如视频。这样写好后,回到浏览器保存,可以看到倒计时321,成功跳转。在指定时间后,浏览器会自动跳转,功能已经实现。
今天的分享就到这里,希望各位同学可以照着写3遍,做到不看视频也能写出来。所有案例和相关文档都可以向我索取。
我们下期再见,想学编程可以关注网页编程、服务端编程、数据库和算法方面的内容。
点赞支持一下。
外话:近来想把网站做下更新,从框架到内容的更新,但又不想放弃SEO的优势,日常工作用到vue.js在SEO方面劣势较多,果断选择了Nuxt.js,苦于国内文章抄袭的非常严重 如某n 某书,最终在稀土找到一篇像样的文章,以头条为平台记录网站改版全过程。
此文章建议在PC端查看,涉及到代码部分,移动端查看确实不方便
简而言之,Nuxt.js是帮助Vue.js轻松完成服务端渲染工作的框架。Nuxt.js预设了服务端渲染所需要的各种配置,如异步数据,中间件,路由。它好比是 Angular Universal 之于 Angular, Next.js 之于 React。
如Nuxt.js文档所说,通过对客户端/服务端基础架构的抽象,Nuxt.js 让开发者专注于页面的UI渲染。
Nuxt.js的一个重要功能是,通过 generate 命令,生成静态站点。类似于流行的静态生成工具Jekyll。
除了Vue.js 2.0之外,Nuxt.js集成了如下模块: Vue-Router, Vue-Meta 和 Vuex (仅在使用 Vuex 状态树配置项 时引入)。 这样的好处在于,不需要手工配置依赖,不需要同时在客户端和服务端配置相同的库。 Nuxt.js在包含如上依赖的情况下,总大小仍然保持在 28kb min+gzip (如果使用了 Vuex 特性的话为 31kb)。
另外,Nuxt.js 使用 Webpack 和 vue-loader 、 babel-loader 来处理代码的自动化构建工作(如打包、代码分层、压缩等等)。
当你访问一个基于Nuxt.js构建的页面时,发生了的事情如下:
下图阐述了 Nuxt.js 应用一个完整的服务器请求渲染的流程,摘自官网:
下面让我们动手创建一个基于Nuxt.js简单的静态博客。我们的发送的请求,返回 mock 的JSON数据。
完成下面的例子,你需要了解基础的 vue.js 知识。如果你是个新手,你可以通过Jack Franklin的getting started guide了解 Vue.js 2.0。同时,我将使用ES6语法,你可以参考www.sitepoint.com/tag/es6/ 重温ES6语法。
我们的 Demo 最终效果如下:
本文中代码可参照 GitHub, demo 地址如下:https://github.com/sitepoint-editors/nuxt-ssr-blog/
开始使用 Nuxt.js 最简单的方式就是使用 Nuxt.js 团队自己开发的脚手架。我们可以使用 vue-cli 快速创建我们的项目 (ssr-blog):
`vue init nuxt/starter ssr-blog`
# 提示: 如果你没有安装过vue-cli,请先通过npm install -g vue-cli 命令安装vue-cli。
# 之后,我们将安装项目的依赖
cd ssr-blog
npm install
# 现在我们启动程序:
`npm run dev`
# 如果正确启动, 你能访问 http://localhost:3000
# 展示的页面是 Nuxt.js 模板的初始页面
# 你也可以通过查看页面源代码,验证页面所展示的一切内容,都是服务端渲染好的。
下面,我们简单配置下 nuxt.config.js,包含以下选项:
// ./nuxt.config.js
module.exports = {
/*
* Headers of the page
*/
head: {
titleTemplate: '%s | Awesome JS SSR Blog',
// ...
link: [
// ...
{
rel: 'stylesheet',
href: 'https://cdnjs.cloudflare.com/ajax/libs/bulma/0.4.2/css/bulma.min.css'
}
]
},
// ...
}
在如上配置文件下,我们使用 titleTemplate 字段 title 变量指定文章题目,在渲染之前用title变量值替换掉%s这个占位,填充到titleTemplate 。
同时,我也使用了 CSS 框架, Bulma, 预设一些样式。通过 link 配置项。
提示: Nuxt.js使用 vue-meta 更新我们的 html headers 信息。所以,我们可以看看 meta 具体的配置项,优化页面 html 信息。
现在,我们可以通过几个步骤,完成博客的页面和功能。
首先,我们将为我们所有的页面定义一个通用的基本布局。我们通过修改 layouts/default.vue 文件,更新 main Nuxt.js layout:
<!-- ./layouts/default.vue -->
<template>
<div>
<!-- navigation -->
<nav class="nav has-shadow">
<div class="container">
<div class="nav-left">
<nuxt-link to="/" class="nav-item">
Awesome JS SSR Blog!
</nuxt-link>
<nuxt-link active-class="is-active" to="/" class="nav-item is-tab" exact>Home</nuxt-link>
<nuxt-link active-class="is-active" to="/about" class="nav-item is-tab" exact>About</nuxt-link>
</div>
</div>
</nav>
<!-- /navigation -->
<!-- displays the page component -->
<nuxt/>
</div>
</template>
在我们通用的布局里,我们仅仅对页面添加导航栏,我们通过 component进一步完成具体页面模块的定制。你可以查看components-nuxt-link 进一步了解。
在创建布局时component非常重要,它决定具体页面展示的元素。
当然,component也可以做更多事情,比如定义通用组件和错误页面,但是我们的博客很简单,不需要这些功能。强烈建议阅读 Nuxt.js documentation on views ,你可以通过这篇文章了解更多 Nuxt.js 特性。
Nuxt.js 页面是以 单文件组件 形式组织目录结构。 Nuxt.js 自动找到目录下每个 .vue 文件,并添加到页面中。
我们可以通过修改 index.vue 文件修改主页, 通过 Nuxt.js 创建的文件如下:
<!-- ./pages/index.vue -->
<template>
<div>
<section class="hero is-medium is-primary is-bold">
<div class="hero-body">
<div class="container">
<h1 class="title">
Welcome to the JavaScript SSR Blog.
</h1>
<h2 class="subtitle">
Hope you find something you like.
</h2>
</div>
</div>
</section>
</div>
</template>
<script>
export default {
head: {
title: 'Home'
}
}
</script>
如前所述,在渲染之前,题目将自动填充至文件。
我们现在可以刷新页面,看看主页的变化。
Nuxt.js 还有一个优秀的特性,监听文件夹下文件的更改,所以,在文件更改时,不需要重启应用更新。
来,我们添加一个简单的 about.vue 页面:
<!-- ./pages/about.vue -->
<template>
<div class="main-content">
<div class="container">
<h2 class="title is-2">About this website.</h2>
<p>Curabitur accumsan turpis pharetra <strong>augue tincidunt</strong> blandit. Quisque condimentum maximus mi, sit amet commodo arcu rutrum id. Proin pretium urna vel cursus venenatis. Suspendisse potenti. Etiam mattis sem rhoncus lacus dapibus facilisis. Donec at dignissim dui. Ut et neque nisl.</p>
<br>
<h4 class="title is-4">What we hope to achieve:</h4>
<ul>
<li>In fermentum leo eu lectus mollis, quis dictum mi aliquet.</li>
<li>Morbi eu nulla lobortis, lobortis est in, fringilla felis.</li>
<li>Aliquam nec felis in sapien venenatis viverra fermentum nec lectus.</li>
<li>Ut non enim metus.</li>
</ul>
</div>
</div>
</template>
<script>
export default {
head: {
title: 'About'
}
}
</script>
现在我们访问 http://localhost:3000/about 看看about页面,无需重启,非常方便。
我们的首页在没有内容的时候展示如上, 所以下一步,我们要在 index.vue 上添加博客列表这个组件。
首先,我们需要把 JSON 格式的文章保存在服务根目录下。文件可以从 这里下载,或者你可以复制下面的 JSON 到根目录文件夹 posts.json 下:
[
{
"id": 4,
"title": "Building universal JS apps with Nuxt.js",
"summary": "Get introduced to Nuxt.js, and build great SSR Apps with Vue.js.",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>",
"author": "Jane Doe",
"published": "08:00 - 07/06/2017"
},
{
"id": 3,
"title": "Great SSR Use cases",
"summary": "See simple and rich server rendered JavaScript apps.",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>",
"author": "Jane Doe",
"published": "17:00 - 06/06/2017"
},
{
"id": 2,
"title": "SSR in Vue.js",
"summary": "Learn about SSR in Vue.js, and where Nuxt.js can make it all faster.",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>",
"author": "Jane Doe",
"published": "13:00 - 06/06/2017"
},
{
"id": 1,
"title": "Introduction to SSR",
"summary": "Learn about SSR in JavaScript and how it can be super cool.",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>",
"author": "John Doe",
"published": "11:00 - 06/06/2017"
}
]
提示: 理想情况下,我们应该从通过 API 获取文章数据。
components 存放在 components 文件夹下,我们可以创建如下组件:
<!-- ./components/Posts.vue -->
<template>
<section class="main-content">
<div class="container">
<h1 class="title has-text-centered">
Recent Posts.
</h1>
<div class="columns is-multiline">
<div class="column is-half" v-for="post in posts">
<div class="card">
<header class="card-header">
<p class="card-header-title">
{{ post.title }}
</p>
</header>
<div class="card-content">
<div class="content">
{{ post.summary }}
<br>
<small>
by <strong>{{ post.author}}</strong>
\\ {{ post.published }}
</small>
</div>
</div>
<footer class="card-footer">
<nuxt-link :to="`/post/${post.id}`"
class="card-footer-item">
Read More
</nuxt-link>
</footer>
</div>
</div>
</div>
</div>
</section>
</template>
<script>
import posts from '~/posts.json'
export default {
name: 'posts',
data () {
return { posts }
}
}
</script>
我们引入 JSON 文件充当异步数据,通过 v-for 指令循环列表,取出我们需要的属性填充进组件模板展示。
提示: ~ 符号是 / 的别名。你可以查看 这篇文档 了解更具体的用法。
下面,我们添加 component 到主页:
<!-- ./pages/index.vue -->
<template>
<div>
<!-- ... -->
<posts />
</div>
</template>
<script>
import Posts from '~components/Posts.vue'
export default {
components: {
Posts
},
// ...
}
</script>
现在,我们为文章页配置动态路由,我们以 /post/1 为例:
为此,我们添加 post 文件夹到 pages 目录下,如下:
pages
└── post
└── _id
└── index.vue
我们的程序生成相应的动态路由:
router: {
routes: [
// ...
{
name: 'post-id',
path: '/post/:id',
component: 'pages/post/_id/index.vue'
}
]
}
更新单一发布文件:
<!-- ./pages/post/_id/index.vue -->
<template>
<div class="main-content">
<div class="container">
<h2 class="title is-2">{{ post.title }}</h2>
<div v-html="post.content"></div>
<br>
<h4 class="title is-5 is-marginless">by <strong>{{ post.author }}</strong> at <strong>{{ post.published }}</strong></h4>
</div>
</div>
</template>
<script>
// import posts saved JSON data
import posts from '~/posts.json'
export default {
validate ({ params }) {
return /^\d+$/.test(params.id)
},
asyncData ({ params }, callback) {
let post = posts.find(post => post.id === parseInt(params.id))
if (post) {
callback(null, { post })
} else {
callback({ statusCode: 404, message: 'Post not found' })
}
},
head () {
return {
title: this.post.title,
meta: [
{
hid: 'description',
name: 'description',
content: this.post.summary
}
]
}
}
}
</script>
Nuxt.js通过添加通用方法,简化开发流程。看看我们应该如何在单文件应用中使用它。
现在我们可以再次访问我们的博客看到所有路线和页面正常工作,并查看页面源代码生成的HTML。我们有一个服务器端JavaScript应用程序呈现功能。
接下来,我们要生成程序的 HTML 静态文件。
我们需要对 Nuxt.js 做一个小修改,Nuxt.js 默认忽略动态路由。为了生成动态路由文件,我们需要修改 ./nuxt.config.js
我们使用回调函数,返回以后包含动态路由的列表:
// ./nuxt.config.js
module.exports = {
// ...
generate: {
routes(callback) {
const posts = require('./posts.json')
let routes = posts.map(post => `/post/${post.id}`)
callback(null, routes)
}
}
}
如果你想查看全部关于 generate 的配置, 可以参照 这篇文档 。
运行如下命令,生成全部页面:
`npm run generate`
Nuxt 将所有生成的页面放到 dist 文件夹下。
最后一步,可以使用 Nginx 进行部署,nginx的安装过程此文不再赘述。
generate 命令来生成我们页面的静态文件,假如,我们需要回复。
下一期讲,改版中的踩坑问题。
*请认真填写需求信息,我们会在24小时内与您取得联系。