文档章节

Python-Flask搭建博客 Day08 难说再见

ltoddyc
 ltoddyc
发布于 2017/09/06 19:09
字数 787
阅读 28
收藏 0

源代码: https://github.com/LToddy/blog

技术交流群:630398887(欢迎一起吹牛)

写在前面的话: 如果要运行这次的代码,请先:

$ python3 manage.py shell
>>> from manage.py import *
>>> db.drop_all()
>>> db.create_all()
>>> exit()

因为我已经注册了用户了。

到目前为止,blog还是有很多问题的:

  • 数据库建模方面,没有使用外键,也就是说没有一对多或者多对一的关系。也就是说,对于目前的blog,如果你注册了多个用户,那么这些用户对于所有文章是共用的。而不是各自用户有各自的文章 —— 如何解决,当然你也可以使用外键来链接两个表实现,或者我们就只允许一个用户(管理员)的存在,私人使用。

  • 我们的后台功能太欠缺。目前只有一个发布功能,其实还需要:

    • 文章的修改
    • 文章的删除
  • 我们没有设置文章的类型,所以目前无法给文章分类,其实也很好解决,在app/models.py的文章模型中加入一个type字段就好。

第一个问题,简单的解决方法:在config.py中加一个全局变量(bool类型),初始值为False,表示目前没有用户注册,当第一个用户注册之后,这个变量设为True,表示已经有一个用户注册了,那么就可以不再让第二个用户注册了。

<small>config.py</small>

import os

basedir = os.path.abspath(os.path.dirname(__file__))

is_exist_admin = False


class Config:
    SECRET_KEY = 'a string'
    # 数据库配置
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    @staticmethod
    def init_app(app):
        pass

多了这个: is_exist_admin = False

from config import is_exist_admin

@admin.route('/register', methods=['GET', 'POST'])
def register():
    global is_exist_admin
    form = RegistrationForm()
    if form.validate_on_submit() and not is_exist_admin:
        try:
            user = User(username=form.username.data, password=form.password.data)
            db.session.add(user)
            is_exist_admin = True
            flash('注册成功')
            return redirect(url_for('admin.login'))
        except:
            flash('帐号已存在')
            return redirect(url_for('admin.register'))
    else:
        flash('管理员已存在')
    return render_template('admin/register.html', form=form)

第二个问题:

先解决添加文章的修改功能,我们可不可以这样子,把发布文章和更新文章视作同一种操作。 我们将发布和更新文章这两个功能合二为一,怎么说呢。当你去发布文章的时候,根据标题去查询数据库有没有这篇文章,如果没有这篇文章,那么就在数据库中添加这个信息,如果有这篇文章,那么就去更改数据库这条信息的内容。

<small>app/admin/views</small>

@admin.route('/', methods=['GET', 'POST'])
def index():
    form = PostForm()
    if not current_user.is_authenticated:
        return redirect(url_for('admin.login'))
    if form.validate_on_submit():
        article = Article(title=form.title.data, content=form.content.data)
        if Article.query.filter_by(title=form.title.data).first() is None:  # 文章不存在
            db.session.add(article)
            flash('发布成功')
        else:  # 文章已存在
            article = Article.query.filter_by(title=form.title.data).first()
            article.content = form.content.data
            db.session.add(article)
            # db.session.commit()
            flash('文章更新成功')
        form.title.data = ''
        form.content.data = ''
    return render_template('admin/index.html', form=form)

最后是删除文章:这里我就不写了,我相信你可以自己做到。

说点额外话:

一个网站构成的,

  • 用户看到的界面(前端)
  • 后端表单验证+数据库

前端从来不是问题,因为毕竟你去百度可以搜索到各种各样炫酷的模板。 后端,这是核心。数据的处理在这里。

© 著作权归作者所有

共有 人打赏支持
ltoddyc
粉丝 0
博文 8
码字总数 13949
作品 0
淄博
Linux搭建Python web环境(nginx + flask + uwsgi)

去年的时候,就曾使用Nginx+Flask+uwsgi搭建过python的web环境。但在最近搭建的时候,又去网上找了一遍教程,所以打算写一篇笔记做下记录。 在搭建之前,有必要了解下发送一个请求的整个流程...

liuchungui
05/14
0
0
(旧)3- Flask构建弹幕微电影网站- 课程介绍

Flask 构建微电影视频网站 已上线演示地址: http://movie.mtianyan.cn 项目源码地址:https://github.com/mtianyan/movieproject 持续更新教程与代码commit。欢迎大家一起学习,star。 介绍微...

天涯明月笙
02/11
0
0
nginx+uwsgi+flask环境搭建

想自己搭建一个Blog,功能不是很复杂,所以选用了python的flask框架,在参照网上的资料搭出Hello World之后将知识汇总一下,以便以后查看。 系统:Ubuntu 14.04 首先安装flask,nginx,pip(方...

L很失败L
2015/08/08
0
2
雪峰磁针石博客]flask构建自动化测试平台3-模板

3-模板 理想情况下,前端和后端组件之间的完全隔离。我们可以在很大程度上使用Jinja来实现这一目标。 到本章将扩展我们的应用程序,为所选出版物显示不止一个标题。我们将为每个出版物显示多...

Python测试开发人工智能
07/07
0
0
[雪峰磁针石博客]flask构建自动化测试平台1-hello

简介 第一部分 Flask实例。学习使用Flask开发,构建功能完备的Web应用程序。我们开发了动态的头条新闻应用程序,可显示最新的新闻标题以及最新的货币和天气信息。在项目二中,我们构建了由M...

Python测试开发人工智能
06/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
22分钟前
0
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
45分钟前
3
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
53分钟前
1
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
21
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部