import os
from flask import Blueprint
from flask import render_template, flash, redirect, session, url_for, request, current_app
from flask_login import login_required
from fengweb.extensions import db
from fengweb.forms import UploadMarkdown, PassageSubmit, PassageEdit, MessageEdit, CategorySubmit, CategoryEdit
from fengweb.models import Post, Message, Category
from fengweb.utils import redirect_back
admin_bp = Blueprint("admin", __name__)
@admin_bp.route("/upload_md", methods=["GET", "POST"])
@login_required
def upload_md():
form = UploadMarkdown()
if form.validate_on_submit():
f = form.file.data
file_name = f.filename
f.save(os.path.join(current_app.config["UPLOAD_MARKDOWN_PATH"], file_name))
flash(f"上传{file_name}成功!")
session["filenames"] = [file_name]
return redirect(url_for("blog.index"))
return render_template("admin/upload_md.html", form=form)
@admin_bp.route("/manage_passage")
@login_required
def manage_passage():
page = request.args.get("page", 1, type=int)
per_page = current_app.config["FENGWEB_MANAGE_MESSAGE_PER_PAGE"]
pagination = Post.query.order_by(Post.timestamp.desc()).paginate(page=page, per_page=per_page)
posts = pagination.items
return render_template("admin/manage_passage.html", page=page, pagination=pagination, posts=posts)
@admin_bp.route("/manage_passage/new_passage", methods=["GET", "POST"])
@login_required
def new_passage():
form = PassageEdit()
if form.validate_on_submit():
title = form.title.data
body = form.body.data
category = Category.query.get(form.category.data)
post = Post(title=title, body=body)
category.posts.append(post)
db.session.add(post)
db.session.commit()
flash("新文章已创建!")
return redirect(url_for("admin.manage_passage"))
return render_template("admin/new_passage.html", form=form)
@admin_bp.route("/manage_passage/edit_passage/<int:post_id>", methods=["GET", "POST"])
@login_required
def edit_passage(post_id):
form = PassageSubmit()
post = Post.query.get(post_id)
if form.validate_on_submit():
post.title = form.title.data
post.category = Category.query.get(form.category.data)
post.body = form.body.data
db.session.commit()
flash("文章已更新!")
return redirect(url_for("admin.manage_passage"))
form.title.data = post.title
form.category.data = post.category_id
form.body.data = post.body
return render_template("admin/edit_passage.html", form=form)
@admin_bp.route("/manage_passage/delete_passage/<int:post_id>", methods=["GET", "POST"])
@login_required
def delete_passage(post_id):
post = Post.query.get(post_id)
db.session.delete(post)
db.session.commit()
flash("文章删除成功!")
return render_template("admin/manage_passage.html")
@admin_bp.route("/manage_message")
@login_required
def manage_message():
page = request.args.get("page", 1, type=int)
per_page = current_app.config["FENGWEB_MANAGE_POST_PER_PAGE"]
pagination = Message.query.order_by(Message.timestamp.desc()).paginate(page=page, per_page=per_page)
message_list = pagination.items
return render_template("admin/manage_message.html", page=page, pagination=pagination, messages=message_list)
@admin_bp.route("/manage_message/edit_message/<int:message_id>", methods=["GET", "POST"])
@login_required
def edit_message(message_id):
form = MessageEdit()
message = Message.query.get(message_id)
if form.validate_on_submit():
message.name = form.name.data
message.about = form.about.data
db.session.commit()
flash("留言已更新!")
return redirect(url_for("admin.manage_message"))
form.name.data = message.name
form.about.data = message.about
return render_template("admin/edit_message.html", form=form)
@admin_bp.route("/manage_message/delete_message/<int:message_id>", methods=["GET", "POST"])
@login_required
def delete_message(message_id):
message = Message.query.get(message_id)
db.session.delete(message)
db.session.commit()
flash("留言删除成功!")
return render_template("admin/manage_message.html")
@admin_bp.route("/manage_category")
@login_required
def manage_category():
category_list = Category.query.all()
return render_template("admin/manage_category.html", category_list=category_list)
@admin_bp.route("/manage_category/new_category", methods=["GET", "POST"])
@login_required
def new_category():
form = CategorySubmit()
if form.validate_on_submit():
name = form.name.data
n_category = Category(name=name)
db.session.add(n_category)
db.session.commit()
flash("新分类已创建!")
return redirect_back()
return render_template("admin/new_category.html", form=form)
@admin_bp.route("/manage_category/edit_category/<int:category_id>", methods=["GET", "POST"])
@login_required
def edit_category(category_id):
form = CategoryEdit()
category = Category.query.get(category_id)
if form.validate_on_submit():
category.name = form.name.data
db.session.commit()
flash("分类已更新!")
return redirect(url_for("admin.manage_category"))
form.name.data = category.name
return render_template("admin/edit_category.html", form=form)
@admin_bp.route("/delete_category/<int:category_id>", methods=["GET", "POST"])
@login_required
def delete_category(category_id):
category = Category.query.get(category_id)
if category.id == 1:
flash("你不能删除默认分类!")
return redirect_back()
category.delete()
flash("分类已删除!")
return render_template("admin/manage_category.html")
基于Flask、Bootstrap、Markdown等开发的博客网站.zip
需积分: 0 119 浏览量
更新于2023-09-28
收藏 59.77MB ZIP 举报
标题中的“基于Flask、Bootstrap、Markdown等开发的博客网站”揭示了这个项目的核心技术栈。这是一款使用Python的Web框架Flask,结合前端UI库Bootstrap,以及文本标记语言Markdown来构建的博客系统。让我们详细了解一下这三个关键组件及其在开发中的作用。
**Flask**:
Flask是Python的一款轻量级Web应用框架,它遵循WSGI标准。它的核心特点在于其轻便和模块化,允许开发者根据需要选择和集成各种扩展。在创建博客网站时,Flask可以处理路由(如定义URL到特定函数的映射),处理HTTP请求,以及提供模板引擎来渲染HTML页面。Flask的微服务架构使得它易于上手,同时也适合大型项目,因为你可以将不同功能拆分成单独的模块或扩展。
**Bootstrap**:
Bootstrap是由Twitter开发的开源前端框架,主要用于简化网页设计和响应式布局。它提供了丰富的预定义CSS样式、JavaScript组件和字体图标,帮助开发者快速构建美观且跨平台兼容的用户界面。在博客网站中,Bootstrap可以用来设计导航栏、文章列表、评论区域等元素,确保它们在不同设备上都有良好的显示效果。
**Markdown**:
Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML。在博客系统中,Markdown特别适合用于撰写博客文章。作者可以用简单的语法来格式化文本,如#号表示标题,-号和*号表示列表,`代码块`表示代码,等等。Markdown的简洁性和可读性让作者专注于内容创作,而无需关注复杂的HTML标签。
在"压缩包子文件的文件名称列表"中,我们看到的是"FengWeb-master",这通常代表一个项目的根目录,其中可能包含项目源码、配置文件、README文档等。具体来说,"master"分支通常指的是Git版本控制中的主要分支,用于存储项目的稳定版本。在这个博客项目中,FengWeb可能是项目的名字,里面包含了如以下部分:
1. **app.py**:这是Flask应用的主文件,定义了应用实例、路由规则和视图函数。
2. **templates**:存放HTML模板文件,Flask使用这些模板与后台数据结合生成最终的网页。
3. **static**:存放静态资源,如CSS样式表、JavaScript文件和图片等,这些文件会被直接发送给浏览器。
4. **markdown_files**:可能存放Markdown格式的博客文章,通过Flask的模板引擎和Markdown解析器转换为HTML展示。
5. **config.py**:可能包含应用的配置信息,如数据库连接、secret_key等。
6. **requirements.txt**:列出项目依赖的Python库,方便其他人安装和运行项目。
7. **README.md**:项目介绍和指南,通常用Markdown编写。
总结起来,这个项目利用了Flask的灵活性和可扩展性,Bootstrap的界面设计便利,以及Markdown的文本编写友好性,创建了一个功能齐全、外观美观的博客平台。开发者可以通过这个项目学习如何整合这些技术,构建自己的Web应用。
天天501
- 粉丝: 622
- 资源: 5905
最新资源
- (2951806)学生成绩管理系统软件
- 在线远程考试-JAVA-基于Spring Boot在线远程考试系统的设计与实现(毕业论文+PPT+开题+任务书)
- (31743232)图书管理系统 毕业设计
- 考虑大规模电动汽车接入电网的双层优化调度策略 软件:Matlab;cplex 介绍:摘要:随着经济发展和化石燃料短缺、环境污染严重的矛盾日益尖锐,电动汽车( Electric Vehicle,EV)的
- 武器检测54-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- (42757812)0.96寸OLED显示屏STC8A8K64S4A12-IIC-例程
- (5820406)学籍管理系统vb+sql
- (767402)学生管理系统(VB+SQL)+论文
- VBA视频教程 0002
- 0f7c779db05cdd16f029ff16c742568e.apk
- 电影院购票-JAVA-基于springBoot的电影院购票系统设计与实现(毕业论文)
- (173083656)河西学院网络工程javaweb期末大作业.zip
- (174380844)1950年至2020年间各省GDP
- 基于Java+Swing+Mysql的超市客户关系管理系统(高分课程作业)
- 家政服务平台-JAVA-基于springBoot的家政服务平台的设计与实现(毕业论文)
- (175700654)适合练手、课程设计、毕业设计的Java项目源码:图书馆书库管理系统设计(论文+源代码).rar