史上最详细注释,用flask写一个博客系统

这篇具有很好参考价值的文章主要介绍了史上最详细注释,用flask写一个博客系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文本用flask写个博客系统,源码带有详细注释,通俗易懂,拿去就能用。点 这里 查看演示。博客效果如下,博客首页:

史上最详细注释,用flask写一个博客系统,Python,数据库,Flask,flask,python,后端,博客

这个博客麻雀虽小,但五脏俱全。有如下功能:

  1. 博客文章浏览
  2. 用户注册
  3. 用户登录/登出
  4. 发文章/修改文章/删除文章

为了简单,没有用MySQL数据,使用了Sqlite数据库。博客来自flask官方教程,用来学习前后端开发,基于模板的后端开发,也能够学习python后端框架flask。因为例子够简单,适合初学者入门,当然前提是,你得有python编程基础。好了,项目的源代码已经传到这里了 flaskr,打开连接看readme.md文档,就知道怎么部署这个博客了(部署就是把博客跑起来!)。源代码添加了详细的注释,方便初学的朋友学习食用。

比如flaksr的主文件:

import os
from flask import Flask


# 应用工厂函数
def create_app(test_config=None):
    # 设置配置相对于实例文件夹(instance folder),
    # flask从实例文件夹读取配置,而不是flask应用的根目录,
    # __name__是让flask知道自己的位置以设置一些路径,如应用程序的根目录和静态文件目录
    app = Flask(__name__, instance_relative_config=True)

    # 设置app默认配置
    app.config.from_mapping(
        # 保护flask和扩展(extensions)的数据安全
        SECRET_KEY='dev',
        # sqlite文件保存路径
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    # 加载真正的配置
    if test_config is None:
        # config.py文件也存放在实例文件夹中
        app.config.from_pyfile('config.py', silent=True)
    else:
        # 加载测试配置
        app.config.from_mapping(test_config)

    # 创建实例文件夹
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # 一个简单的路由
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    # 初始化数据库表
    from . import db
    db.init_app(app)

    # 注册认证(auth)蓝图
    from . import auth
    app.register_blueprint(auth.bp)

    # 注册博客(写博文、看博文等)蓝图
    from . import blog
    app.register_blueprint(blog.bp)

    # 添加一条映射关系:/ -> index,
    # 让url_for('index')返回/,让url_for('blog.index')也返回/(即blog.py的@bp.route('/'))
    app.add_url_rule('/', endpoint='index')

    return app


# 进入flask_tutorial目录,运行app并开启调试模式:
# flask --app flaskr run --debug

# 进入flask_tutorial目录,初始化数据库表:
# flask --app flaskr init-db

还带有pytest测试目录tests,比如tests/test_auth.py文件用来测试认证相关的功能:

import pytest
from flask import g, session
from flaskr.db import get_db


def test_register(client, app):
    # 测试获取注册页是否符合预期
    assert client.get('/auth/register').status_code == 200

    # 测试提交表单给注册页
    response = client.post(
        # 用字典形式传递数据,测试客户端会转换为表单数据给视图函数
        '/auth/register', data={'username': 'a', 'password': 'a'}
    )

    # 如果注册成功,会跳转到登录页,此时响应头中会有Location字段
    assert response.headers['Location'] == '/auth/login'

    with app.app_context():
        assert get_db().execute(
            'SELECT * FROM user WHERE username="a"',
        ).fetchone() is not None


# 使用pytest参数化测试装饰器,
# 第一个参数指定被装饰的test_register_validate_input测试用例会有三个参数,
# 测试用例的client参数是fixture装饰过的函数,它有参数app,app也是被fixture
# 装饰过的函数,因此pytest会依次:调用app->返回值给client->调用client->
# 返回值给test_register_validate_input。
# 第二个参数元组中有三组数据,pytest会分别传递给测试用例,以便把三种情况都测试一遍,
# 利用参数化测试的好处是不用把测试用例test_register_validate_input重复写三遍
@pytest.mark.parametrize(
    ('username', 'password', 'message'), (
        ('', '', b'Username is required.'),
        ('a', '', b'Password is required.'),
        ('test', 'test', b'already registered'),
    )
)
def test_register_validate_input(client, username, password, message):
    response = client.post(
        '/auth/register',
        data={'username': username, 'password': password}
    )
    # response.data是bytes类型,
    # 测试注册失败的各种情况,看响应体中是否包含对应的错误提示信息
    assert message in response.data


def test_login(client, auth):
    assert client.get('/auth/login').status_code == 200
    response = auth.login()  # 登录 test/test 用户
    assert response.headers['Location'] == '/'
    
    # 在请求之外访问 session 会引发错误,所以使用with上下文
    with client:
        client.get('/')
        assert session['user_id'] == 1
        assert g.user['username'] == 'test'


@pytest.mark.parametrize(
    ('username', 'password', 'message'), (
        ('a', 'test', b'Incorrect username.'),
        ('test', 'a', b'Incorrect password.'),
    )
)
def test_login_validate_input(auth, username, password, message):
    response = auth.login(username, password)
    assert message in response.data


def test_logout(client, auth):
    auth.login()

    with client:
        auth.logout()
        assert 'user_id' not in session

所有的文件,包括源码文件,测试文件,部署说明都在 这里 了。

部署到云服务器,可以用nginx做web服务器,博客代码跑在wsgi服务器上,比如waitress,或者Gunicorn等等。

nginx配置文件可以这样写,创建一个文件flaskr.conf,内容如下:

server {
    listen 80 default_server;
    server_name _;

    # 把所有http请求永久重定向到https
    rewrite ^/(.*) https://$host/$1 permanent;
}

server {
    listen 443 ssl;
    server_name fk.izhaojie.com;    
    index index.html;
    
    # f这是最关键的部分,让nginx把请求转发给flask后端,由wsgi服务处理
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

完!文章来源地址https://www.toymoban.com/news/detail-741287.html

到了这里,关于史上最详细注释,用flask写一个博客系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 史上最详细的Windows10系统离线安装.NET Framework 3.5的方法(附离线安装包下载)

     在Windows10的使用过程中经常会遇到一些软件提示:“你的电脑上的应用需要使用以下Windows功能:.NET Framework 3.5(包括.NET 2.0和3.0)”,而点击“下载并安装此功能”后需要通过Windows更新在线下载安装的,速度是非常慢的,因此下面说一下怎么离线安装.NET Framework 3.5。  1.准备一

    2024年02月20日
    浏览(41)
  • 计算机系统结构期末重点——计算机系统结构基础及并行性的开发(计算机系统结构,李学干(第五版))(史上最详细)

    目录 1. 计算机系统的层次结构(书p1) 2. 计算机系统结构、计算机组成和计算机实现 2.1 计算机系统结构的定义 2.2 计算机组成的定义(p3) 2.3 计算机实现的定义 3. 计算机系统设计的主要方法(p15) 3.1 由上往下设计 3.2 由下往上设计 3.3 从中间开始的设计 4.  软件发展对系

    2024年02月10日
    浏览(60)
  • 史上最详细的八大排序详解!(建议收藏)

    🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!! 关注我,关注我,关注我 , 你们将会看到更多的优质内容!!   从今天开始,我们就进入

    2023年04月20日
    浏览(51)
  • Nacos 安装教程(史上最详细保姆级教程)

    作者:大三的土狗 专栏:SpringCloud    Nacos的全称是Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。   Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,

    2024年02月03日
    浏览(61)
  • Java对接微信支付(史上最详细)

    本文将介绍如何使用Java对接微信支付,包括获取支付参数、支付回调处理等步骤。本文适用于已经熟悉微信支付基本原理的读者。 JDK 1.8 Maven Spring Boot 2.x 微信支付开发文档 为了进行支付,我们需要先获取微信支付的参数信息,包括appid、商户id、支付密钥等。 配置文件 我们

    2024年02月15日
    浏览(42)
  • OpenStack搭建史上最详细步骤 (快速入手)

    搭建openstack平台所需要的两个镜像包:CentOS-7-X86_64-DVD-1804.iso 和 chinaskill_cloud_iaas.iso镜像文件。 在VMware上准备两台虚拟机,分别作为controller(控制)节点和compute节点. 下面是VMware上虚拟机的基础配置。 computecontroller 双网卡,NAT模式和仅主机模式,配置硬盘各给50G 多添的一块

    2024年02月02日
    浏览(47)
  • Ubuntu安装Burp Suite--史上最详细教程

    VMware Workstation下载网址: https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html Burp Suite v2021.6安装包: 链接: https://pan.baidu.com/s/1OqiYpRr2XnWPw6B1Tum2hw?pwd=2001 提取码:2001 ubuntu-18.04.6安装包: 链接: https://pan.baidu.com/s/1SR1Q9ggLnIOErgOLQpzXkA?pwd=2001 提取码:2001 创建新的虚拟

    2024年02月09日
    浏览(44)
  • C++ system()函数的常用用法 (史上最详细)

    目录 一.推荐:     1. system(\\\"pause\\\")     2. system(\\\"color *\\\")     3.system(\\\"title *\\\")     4. system(\\\"cls\\\") 二.文件操作:     1. system(\\\"start *\\\")     2. system(\\\"del *\\\")     3. system(\\\"copy A B\\\")     4. system(\\\"move A B\\\") 三.系统操作     1. 关机,重启,睡眠     2. 日期/时间     3. task     1. system(\\\"pause\\\"

    2024年02月12日
    浏览(44)
  • 算法设计与分析期末复习题(史上最详细)

    算法设计与分析期末复习题(一) 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一

    2023年04月09日
    浏览(51)
  • 史上最详细之Eclipse导入Idea中并运行

    通过idea的open file菜单进行打开我们的项目 或者 主要配置的项目为下图箭头所指地方。 配置JDK,保证下面两个地方的版本一致,不然启动会报错,最后一个选项配置项目的输出路径。 修改 配置项目的文件夹标识。 配置项目的输入路径。 添加项目的jar包依赖。将我们在lib文

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包