Python 30 天实战:个人博客网站开发(基础部分)
gaoyangw 2025-01-11 12:53 46 浏览 0 评论
经过前面一系列对 Flask、数据库操作以及表单处理等知识的学习,今天我们将把这些知识综合运用起来,开发一个简单的个人博客网站的后端部分,并搭配基础的 HTML、CSS 进行页面布局和样式设计,打造出具备基本外观与功能的博客网站雏形。
一、项目准备
- 技术选型与环境搭建:后端框架选用 Flask,它能方便地处理路由、请求和响应等 Web 相关操作。数据库方面继续使用 SQLAlchemy 来连接和操作数据库,这里以 SQLite 数据库为例进行演示(方便本地开发和测试)。前端页面使用 HTML 构建页面结构,CSS 进行样式设计,实现简单的页面布局和美化。
- 数据库设计与模型定义(使用 SQLAlchemy):
首先创建一个表示文章的数据库表模型,代码如下:
from flask import Flask
from sqlalchemy import create_engine, Column, Integer, String, Text
from sqlalchemy.orm import sessionmaker, declarative_base
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///blog_database.db"
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
Session = sessionmaker(bind=engine)
db_session = Session()
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String(100), nullable=False)
content = Column(Text, nullable=False)
Base.metadata.create_all(engine)
在上述代码中,定义了 Article 类继承自 declarative_base() 创建的基类,该类对应数据库中的 articles 表,包含 id(文章唯一标识,整数类型主键)、title(文章标题,字符串类型且不能为空)、content(文章内容,使用 Text 类型来存储较长的文本,也不能为空)这几个字段。通过 Base.metadata.create_all(engine) 语句让 SQLAlchemy 根据这个模型创建对应的数据库表结构。
二、文章列表展示功能
- 后端路由与数据查询逻辑:
在 Flask 应用中定义路由来获取并展示文章列表,代码如下:
from flask import render_template
@app.route('/')
@app.route('/articles')
def article_list():
articles = db_session.query(Article).all()
return render_template('article_list.html', articles=articles)
在上述代码中,定义了两个路由(根路由 '/' 和 /articles 路由)都指向 article_list 函数,该函数通过 db_session.query(Article).all() 查询出数据库中所有的文章记录,以列表形式返回,然后将这个包含文章对象的列表传递给 article_list.html 模板进行渲染展示。
- HTML 模板设计(article_list.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个人博客 - 文章列表</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<h1>我的博客文章列表</h1>
<ul>
{% for article in articles %}
<li><a href="{{ url_for('article_detail', article_id=article.id) }}">{{ article.title }}</a></li>
{% endfor %}
</ul>
</body>
</html>
在这个模板中,首先设置了页面标题等基本信息,并且引入了外部的 CSS 文件(styles.css,后续会介绍样式设计)。然后通过 Jinja2 模板引擎的循环语法 {% for article in articles %} 遍历从后端传递过来的文章列表,为每篇文章生成一个列表项 <li>,列表项中包含文章标题的链接,链接指向文章详情页面(通过 url_for 函数生成对应的 URL,传递文章的 id 参数给文章详情页面路由)。
三、文章详情页面功能
- 后端路由与根据文章 ID 查询逻辑:
@app.route('/article/<int:article_id>')
def article_detail(article_id):
article = db_session.query(Article).filter_by(id=article_id).first()
if article:
return render_template('article_detail.html', article=article)
return '<h1>文章不存在</h1>'
在上述代码中,定义了 /article/<int:article_id> 路由,用于接收文章的 id 参数,通过 db_session.query(Article).filter_by(id=article_id).first() 从数据库中查询对应 id 的文章记录,如果找到文章则将其传递给 article_detail.html 模板进行渲染展示,若文章不存在则返回相应的提示信息。
- HTML 模板设计(article_detail.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个人博客 - 文章详情</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<h1>{{ article.title }}</h1>
<div class="article-content">
{{ article.content }}
</div>
</body>
</html>
在这个模板中,展示了文章的标题和内容,标题通过 {{ article.title }} 获取传递过来的文章对象的标题属性进行展示,文章内容则放在一个具有特定类名(article-content,方便 CSS 样式设置)的 <div> 元素中进行展示。
四、文章发布功能
- 表单类定义(使用 Flask-WTF):
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired
class ArticleForm(FlaskForm):
title = StringField('文章标题', validators=[DataRequired(message='标题不能为空')])
content = TextAreaField('文章内容', validators=[DataRequired(message='内容不能为空')])
submit = SubmitField('发布文章')
在上述表单类中,定义了文章标题字段(title)、文章内容字段(content),都添加了不能为空的验证规则,还有一个提交按钮字段(submit)用于触发表单提交操作。
- 后端路由与表单处理及数据保存逻辑:
from flask import render_template, redirect, url_for
from flask_wtf import FlaskForm
@app.route('/create_article', methods=['GET', 'POST'])
def create_article():
form = ArticleForm()
if form.validate_on_submit():
title = form.title.data
content = form.content.data
new_article = Article(title=title, content=content)
db_session.add(new_article)
db_session.commit()
return redirect(url_for('article_list'))
return render_template('create_article.html', form=form)
在上述代码中,定义了 /create_article 路由来处理文章发布相关操作,支持 GET(用于显示文章发布页面)和 POST(用于处理表单提交)两种请求方法。在函数中先创建 ArticleForm 的实例 form,如果表单提交且通过验证,就获取表单中的标题和内容数据,创建一个新的 Article 对象并添加到数据库会话中,提交事务将新文章保存到数据库,最后重定向到文章列表页面。若表单未提交或验证不通过,则渲染 create_article.html 模板展示文章发布页面以及可能的错误提示信息。
- HTML 模板设计(create_article.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个人博客 - 发布文章</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<h1>发布新文章</h1>
<form method="post">
{{ form.csrf_token }}
<p>{{ form.title.label }} {{ form.title }}</p>
<p>{{ form.content.label }} {{ form.content }}</p>
<p>{{ form.submit }}</p>
</form>
</body>
</html>
在这个模板中,创建了一个 <form> 表单元素,设置表单提交方法为 POST,并且渲染了表单类中的各个字段(包括 csrf_token 用于防止跨站请求伪造攻击),用户可以在相应的输入框中输入文章标题和内容,点击提交按钮触发表单提交操作。
五、简单的 CSS 样式设计(styles.css,示例部分样式)
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
}
h1 {
text-align: center;
color: #333;
}
ul {
list-style-type: none;
padding: 0;
}
li {
margin-bottom: 10px;
}
a {
text-decoration: none;
color: #0066cc;
}
.article-content {
margin: 20px;
padding: 10px;
background-color: #fff;
border: 1px solid #ccc;
}
上述 CSS 代码对页面的整体字体、背景颜色、标题样式、列表样式、链接样式以及文章内容展示区域的样式等进行了简单设置,让页面看起来更加整洁、美观。
通过今天这个综合练习,我们搭建起了一个简单个人博客网站的后端基础部分,实现了文章列表展示、文章详情查看以及文章发布等核心功能,并通过简单的 HTML、CSS 设计让网站具备了基本的外观。后续可以继续在此基础上完善功能,比如添加用户认证、评论功能等,以及进一步优化页面的样式设计。
#个人博客开发# #Flask 综合应用# #数据库与 Web 应用# #HTML CSS 基础# #Web 功能构建# #Python 项目实战#
- 上一篇:网站开发、备案的重要性及流程概述
- 下一篇:网站开发这些基本常识一定要懂
相关推荐
- 工业品短视频推广/工业品短视频推广,搞懂2点让客户主动找上门
-
工业品短视频推广/工业品短视频推广,搞懂2点让客户主动找上门。为什么你拍了那么多短视频都没有效果,我们陪跑了几百家客户,发现没效果的账号基本就这3种情况,一种是把短视频当成朋友圈,晒日常生活,账号标签...
- 流程优化,其实是一场管理变革(流程优化的三个原则)
-
“信息化”一词,相信大家都不会感到陌生,但什么是信息化?企业信息化要做些什么?对此的理解真是仁者见仁智者见智。...
- 引爆中小卖家免费流量入口关键词梯形架构
-
“在我从代运营做天猫转到自己去经营自己的C店的时候,我终于知道,原来这个世界上做淘宝的,并非每一个人多那么有钱可以去砸直通车,也不是每一个人多可以请得起薪酬十来万的设计的,近两年我一直在摸索一种适合小...
- 百度搜索2015移动大事记:优化、流量追查等
-
站长之家(Chinaz.com)注:纵观2015这一年,百度搜索的关键词不外乎“移动”二字。为了响应移动互联网的大势,百度不遗余力的在移动搜索上下足了功夫。从搜索引擎算法、到站长平台工具都做出了许多改...
- 百度站搜带你玩转站内流量(百度站长app)
-
先给大家看几张效果图:图1图2图3这3种激发用户搜索需求的牛B武器你的站点“武装”了么?使用效果如何?现在让我们来看看一下网站使用后的心得以及效果:比特网:由于比特之前有自己的站内搜索工具,所以百度刚...
- 继PC端后 百度移动搜索也将取消refer关键词显示
-
站长之家(Chinaz.com)12月4日消息今年6月25日,百度搜索正式取消了referer中关于关键词的显示。近日,百度站长平台在公告中表示“百度移动搜索中也将逐步取消referer关键词的显示”...
- 知己知彼,百战不殆--六个方法帮你分析对手网站
-
好的推广专员对竞争对手的网站进行分析是必不可少的,根据竞争对手每个阶段及时做好SEO的调整。做好知彼知己才能对后期的优化有所帮助。下面小编就分享分析竞争对手网站的六大SEO方法。1、网站年龄网站时间...
- 百度站点属性功能升级 全面取消referer关键词显示
-
站长之家(Chinaz.com)6月30日消息近日,百度站长平台发布公告称已对“站点属性”功能进行升级,此功能已作为独立工具展示于工具导航栏中。站长可通过“站点属性”功能对站点中文名、站点类型、以及站...
- 大连关键词优化推广公司(大连seo推广优化)
-
关键词挖掘与关键词分析提高网站权重的方法最重要的一步就是挖掘有质量的关键词。然后根据关键词的情况进行标题创作和内容的创作。关键词分析分类:1.有指数的关键词2.没有指数的关键词关键词挖掘分类:品牌关...
- 如何实现AI文章免费优化,轻松提升网站排名?
-
你是否觉得,尽管文章内容已经写得很棒,网站的流量却始终无法突破瓶颈?是不是常常觉得自己做了很多优化工作,却依旧难以提高文章的搜索排名?其实,很多人忽略了一个关键问题,那就是“如何优化AI文章”。尤其是...
- AI搜索SEO优化排名公司推荐(seo搜索引擎优化排名)
-
AI搜索SEO优化排名公司推荐,随着AI的平民化,越来越多的人开始通过AI寻找自己的需求,例如通过问AI助手,广州哪家火锅好吃?深圳家政服务哪家公司好?北京全屋定制哪家靠谱?如果这时候AI推荐了你的...
- 构建可以查找相似图像的图像搜索引擎的深度学习技术详解
-
在本文中将介绍如何查找相似图像的理论基础并且使用一个用于查找商标的系统为例介绍相关的技术实现,本文提供有关在图像检索任务中使用的推荐方法的背景信息。阅读本文后你将有能够从头开始创建类似图像的搜索引擎...
- 搜索引擎语法,教你高格逼利用搜索引擎!
-
百度语法1.site把搜索范围规定在特定的站点中。但是有时候你需要找一些特殊的文档,特别是针对于专业性比较强的网站合理使用site可以让你取得事半功倍的效果。举例说明:site:sina.com(不...
- Off-eBay搜索引擎下,listing和店铺 SEO技巧
-
雨果网从外媒近日报道中了解到,eBay正在举行一系列促进销售增长的专家网络研讨会(ExpertAdviceGrowthWebinars),第一场在3月3日举行。外媒为未参加网络研讨会的卖家,挑出...
- 搜索引擎原理系列教程:收录、索引、排名
-
《搜索引擎原理系列教程》这个虽然称不上书籍,但由于里面信息量以及内容比较实用,也弥补了百度白皮书的一些短板——话语浮于表面,另外值得鼓励的是,这个教程完全是由一个民间的SEO爱好者总结,这份精神值得称...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 网站建设 (107)
- 网站开发 (47)
- 百度收录 (50)
- 搜索引擎排名优化 (49)
- 关键词优化工具 (51)
- 外贸网站建设 (56)
- seo整站优化吧 (50)
- 苏州网站建设 (59)
- 百度搜索推广 (61)
- 关键词优化公司 (51)
- 广州网站建设 (48)
- 电商网站建设 (49)
- 百度站长平台 (48)
- 网站模板 (51)
- 厦门网站建设 (52)
- 百度快照推广 (51)
- 免费网页在线客服系统 (53)
- 雷神代刷网站推广 (53)
- 手机网站建设 (53)
- 网站维护 (53)
- 网页制作教程 (66)
- 百度收录批量查询工具 (48)
- 网站服务器 (53)
- 学生个人网页制作html (56)
- 一键优化 (67)