Flask从入门到做出一个博客的大型教程(一)

本项目全部在虚拟环境中运行,因此请参照前面的文章,链接为https://blog.csdn.net/u014793102/article/details/80302975 建立虚拟环境后,再接着完成本教程的学习。

0 开始之前

网上看了很多教程,都不是很满意,因此自己写一个大型教程,从入门到做出一个比较完整的博客。此次教程不是直接把整个博客直接代码整理出来然后运行一遍就完事,我会从flask的各个模块讲起。所以,如果你没有接触过flask,按照整个教程完整做一遍会掌握flask。(前提是你要有一定Python和web基础)

1 Hello world !

如果你接触过任何编程语言,对这个小标题都会很熟悉,此次对flask的学习也是从这个小例子开始。

准备工作环境

duke@coding:~$ mkdir flask_tutorial

duke@coding:~$ cd flask_tutorial/

duke@coding:~/flask_tutorial$ virtualenv --no-site-package venv
Using base prefix ‘/home/duke/.pyenv/versions/3.6.4‘
New python executable in /home/duke/flask_tutorial/venv/bin/python3.6
Also creating executable in /home/duke/flask_tutorial/venv/bin/python
Installing setuptools, pip, wheel...done.

duke@coding:~/flask_tutorial$ source venv/bin/activate
#进入Python虚拟环境
(venv) duke@coding:~/flask_tutorial$
(venv) duke@coding:~/flask_tutorial$ pip install flask
#创建flask目录
(venv) duke@coding:~/flask_tutorial$ mkdir flask

(venv) duke@coding:~/flask_tutorial$ cd flask/

(venv) duke@coding:~/flask_tutorial/flask$

正式开始

(venv) duke@coding:~/flask_tutorial/flask$ mkdir app

(venv) duke@coding:~/flask_tutorial/flask$ cd app/
#创建初始化文件
(venv) duke@coding:~/flask_tutorial/flask/app$ touch __init__.py

在_ _ init _ _.py中写如下代码,你可以使用pycharm,vscode等IDE来更快的书写代码。

app/_ _ init _ _.py : 项目初始化

from flask import Flask
#创建app应用,__name__是python预定义变量,被设置为使用本模块.
app = Flask(__name__)
#如果你使用的IDE,在routes这里会报错,因为我们还没有创建呀,为了一会不要再回来写一遍,因此我先写上了
from app import routes

创建路由模块,你可以使用IDE直接新建,没有必要要使用命令行创建

(venv) duke@coding:~/flask_tutorial/flask/app$ touch routes.py

app/routes.py : 主页路由

#从app模块中即从__init__.py中导入创建的app应用
from app import app

#建立路由,通过路由可以执行其覆盖的方法,可以多个路由指向同一个方法。
@app.route(‘/‘)
@app.route(‘/index‘)
def index():
    return "Hello,World!"

现在基本都齐全了,但是我们还是需要在app模块之外创建一个主入口,即执行这个主入口就可以达成运行整个项目的目的。

(venv) duke@coding:~/flask_tutorial/flask/app$ cd ..
(venv) duke@coding:~/flask_tutorial/flask$ touch myblog.py

myblog.py : 项目入口

#从app模块中导入app应用
from app import app

#防止被引用后执行,只有在当前模块中才可以使用
if __name__==‘__main__‘:
    app.run()

现在整个小demo就完成了,结构应该是这样的

flask
├── app
│   ├── __init__.py
│   └── routes.py
└── myblog.py

ok,接下来就让项目跑起来

(venv) duke@coding:~/flask_tutorial/flask$ export FLASK_APP=myblog.py

(venv) duke@coding:~/flask_tutorial/flask$ flask run
 * Serving Flask app "myblog.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

在浏览器里输入http://127.0.0.1:5000/ 或者 http://127.0.0.1:5000/index 都可以访问你的项目啦!

2 模板

在1里,我们完成了一个返回值的显示,但这肯定远远不能满足我们需求的。因为我们希望看到的是丰富多彩的网页呀~,有什么办法呢?上一步咱们返回了一个值,那咱们返回一个网页会怎么样呢?

app/routes.py : 返回一个网页

from app import app

@app.route(‘/‘)
@app.route(‘/index‘)
def index():
    user = {‘username‘:‘duke‘}
    html = ‘‘‘
    <html>
    <head>
        <title>Home Page - Microblog</title>
    </head>
    <body>
        <h1>Hello, ‘‘‘ + user[‘username‘] + ‘‘‘!</h1>
    </body>
</html>

    ‘‘‘
    return html

如图所示,这样就完成了返回网页的目的,但是这样实在是太麻烦了,因此肯定有解决这个问题的办法喽。对,模板就是解决这个问题的办法。

(venv) duke@coding:~/flask_tutorial/flask$ mkdir app/templates
#在新建的templates中新建一个index.html
(venv) duke@coding:~/flask_tutorial/flask/app/templates$ touch index.html

app/templates/index.html : 主页模板,将数据显示在其中

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }} - 博客</title>
</head>
<body>
        <h1> Hello ,{{ user.username }} !</h1>
</body>
</html>

这里出现{{ }} 意味着变量,可以接受数据的地方。既然在这里写了变量,那么就要在路由中修改对应的格式,因为要把数据返回才可以。

app/routes.py : 将写在路由中的html删除,并增加一些变量。

#导入模板模块
from flask import render_template
from app import app

@app.route(‘/‘)
@app.route(‘/index‘)
def index():
    user = {‘username‘:‘duke‘}
    #将需要展示的数据传递给模板进行显示
    return render_template(‘index.html‘,title=‘我的‘,user=user)

从新运行后,效果还是符合预期的。但是,如果你传递至模板的数据是空的,那页面显示岂不是很难看?因此我们需要在模板中加上一些判断,看数据是否为空。

app/templates/index.html : 主页模板,完善模板

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
     {% if title %}
        <title>{{ title }} - 博客</title>
        {% else %}
        <title>欢迎来到博客!</title>
        {% endif %}
    </head>
    <body>
        <h1>Hello, {{ user.username }}!</h1>
    </body>
</html>

如果传进来的数据很多,那么就可以使用循环来展示数据。首先,还是对路由里的方法进行修改。

app/routes.py : 增加一些数据

from flask import render_template
from app import app

@app.route(‘/‘)
@app.route(‘/index‘)
def index():
    user = {‘username‘:‘duke‘}
    posts = [
        {
            ‘author‘:{‘username‘:‘刘‘},
            ‘body‘:‘这是模板模块中的循环例子~1‘

        },
        {
            ‘author‘: {‘username‘: ‘忠强‘},
            ‘body‘: ‘这是模板模块中的循环例子~2‘
        }
    ]
    return render_template(‘index.html‘,title=‘我的‘,user=user,posts=posts)

增加了这些数据之后要对模板中的结构进行一些修改。

app/templates/index.html : 循环展示数据

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
     {% if title %}
        <title>{{ title }} - 博客</title>
        {% else %}
        <title>欢迎来到博客!</title>
        {% endif %}
    </head>
    <body>
        <h1>你好呀, {{ user.username }} !</h1>
        {% for post in posts %}
            <div><p>{{ post.author.username }} 说:<b>{{ post.body }}</b></p></div>
        {% endfor %}

    </body>
</html>

我们发现,每次修改页面都是要有很多重复的不必要代码,因此把重复的代码放到一个基类模板里,在里面留上占位符,这样只需要修改其中一部分就可以了,十分方便。

创建一个基类模板

(venv) duke@coding:~/flask_tutorial/flask/app/templates$ touch base.html

app/templates/base.html : 填充内容

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
     {% if title %}
        <title>{{ title }} - 博客</title>
        {% else %}
        <title>欢迎来到博客!</title>
        {% endif %}
    </head>
    <body>
       <div>博客 : <a href="/index">首页</a></div>
        {% block content %}

        {% endblock %}
    </body>
</html>

那么这有什么作用呢?注意这里面有{% block content %} {% endblock %}这一对标签,因此其他页面只需要继承这个页面,然后写上相同的标签,在标签内写上内容,就可以完整的在页面上显示所有内容。既然有了基类模板,那么index.html显示就不需要那么多代码了,这里对index.html进行修改。

app/templates/index.html : 修改格式和内容

{% extends ‘base.html‘ %}

     {% block content %}

       <h1>你好呀, {{ user.username }} !</h1>

        {% for post in posts %}
            <div><p>{{ post.author.username }} 说:<b>{{ post.body }}</b></p></div>
        {% endfor %}

     {% endblock %}

再此访问主页面的地址试一试!

原文地址:https://www.cnblogs.com/tiechui2015/p/9732555.html

时间: 2024-10-08 07:03:50

Flask从入门到做出一个博客的大型教程(一)的相关文章

使用 Github + Hexo 从 0 搭建一个博客

最近有几位同学在公众号后台留言问我的博客站是怎么建站的,思来想去,还是写一篇从 0 开始吧. 前置准备 我们先聊一下前置准备,可能很多同学一听说要自己搭一个博客系统,直接就望而却步.不得有台服务器么,不得搞个数据库么,不需要域名备案么?当然,这些确实是建立一个博客站点需要的东西,如果都没有,问题倒是也不大. 首先,Github 为我们做出了巨大的贡献,直接帮我们解决服务器和域名问题,当然,在国内访问 Github 可能会有些慢,但是国内有 Gitee 啊,完全不逊色 Github 的好不好. 博

Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅

通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一个定制的 Dockerfile 来 Docker 化Dockerize一个应用. Docker 是一个过去两年来从某个 idea 中孕育而生的有趣技术,公司组织们用它在世界上每个角落来部署应用.在今天的文章中,我将讲述如何通过"Docker 化Dockerize"一个现有的应用,来开始我们的 Docker 之旅.这里提到的应用指的就是这个博客! 什么是 Dock

通过Z-BlogPHP程序快速在论坛里搭建一个博客页面

想在我自己的论坛http://www.heimaoxuexi.com搭建一个博客出来.研究了几个博客程序,都不好用,今天测试了下Z-BlogPHP程序,完美搭建:下面讲下具体的步骤: 1.install.php上传到目录里然后按步骤开始安装:2.安装完成后删除zb_install文件夹,这个文件也可以连着一起删除readme.txt:3.选择模版,左边栏最后一步选择应用中心,选择一款喜欢的模版,点击安装,然后回到主题管理处启用:4.开启伪静态,点击插件管理.选择,静态管理中心-开启-选择默认配置

【全网最全的博客美化系列教程】07.添加一个分享的按钮吧

全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添加一只萌萌哒的小仓鼠 [全网最全的博客美化系列教程]04.访客量统计的实现 [全网最全的博客美化系列教程]05.公告栏个性时间显示的实现 [全网最全的博客美化系列教程]06.推荐和反对炫酷样式的实现 [全网最全的博客美化系列教程]07.添加一个分享的按钮吧 [全网最全的博客美化系列教程]08.自定义

ASP.NET写的一个博客系统

由于域名闲置,正好也有服务器空间,短期内开发了一个博客系统. 大家都来谈  http://www.djdlt.com 目前是开放注册,免费发布.(限于空间有限,图片还是尽量少传些) 网站架构: ASP.NET SQLSERVER2008 支持多屏幕响应.如.平板.手机.自适应所有平台. 网站能干什么: 发布你的想法 参与表达你对某件事的看法 将来要怎样: 对发布信息的人提供打赏功能,实现知识就是财富. 注册的发步者实现SNS化管理,增加关注.粉丝.好友等实现交流. 感谢: 感谢博客园提供推广平台

30分钟用 Laravel 实现一个博客

介绍 Laravel 是一款 MVC架构. 目前最流行的 PHP框架. Laravel的优点在于: 丰富的composer类库支持, 优雅的代码, 未来的主流框架(目前市场占有率最高的框架) Laravel的缺点在于: 过于优雅(我们只需要编写极少的代码即可实现功能,意味着底层极其复杂的封装)导致程序的执行效率略低, 和thinkphp等国内主流框架相比,上手难度略高(因为它为我们集成了很多其他的功能,甚至你还需要学习nodeJS相关的知识). 本项目,是完全使用 Laravel框架 内的所提供

博客园美化教程大集合(超详细,看这篇就够了)

阅读目录: 1. 前言 2. 定制自己的博客 0. 美化整体效果 1. 准备工作 2. 自定义个性化导航栏 3. 添加顶部博主信息 4. 添加顶部滚动公告 5. 为博客文章添加目录导航 6. 添加分享功能按键 7. 定制推荐和反对按键的炫酷样式 8. 添加快速返回顶部的功能按键 9. 添加打赏功能按键 10. 添加页面放大缩小功能按键 11. 添加Github图标及链接 12. 添加公告栏图片 13. 添加公告栏文字信息 14. 添加公告栏个性时钟 15. 为公告栏添加访客来源统计 16. 为公

【全网最全的博客美化系列教程】文章总目录

前言 很多热心的园友叫我出一部博客美化系列的教程,都觉得我博客做的很漂亮?之前我也有写过博客美化教程,不过好像一篇文章的篇幅有点过长了,为了方便园友的查看,我决定重新出一套博客美化教程,把原有的功能进行细化,每种功能单独以一篇文章的形式发表,在保留原有功能的基础上,会持续更新探索一些好玩好看的新功能,供园友们学习.既然是园友们提出的想法,我也不能辜负你们的期望啊,喜欢的园友记得点赞收藏加关注哦~~~ 一枚即将步入大三的学生党也是时候需要考虑一下自己的未来了,毕竟学习的时间不多了.我也很久没有更新

【全网最全的博客美化系列教程】05.公告栏个性时间显示的实现

全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添加一只萌萌哒的小仓鼠 [全网最全的博客美化系列教程]04.访客量统计的实现 [全网最全的博客美化系列教程]05.公告栏个性时间显示的实现 [全网最全的博客美化系列教程]06.推荐和反对炫酷样式的实现 [全网最全的博客美化系列教程]07.添加一个分享的按钮吧 [全网最全的博客美化系列教程]08.自定义