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

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

0 开始之前

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

1 Hello world !

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

准备工作环境

duke@coding:~$ mkdir flask_tutorialduke@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: productionWARNING: 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 %}

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

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

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

    Flask从入门到做出一个博客的大型教程(五) 在开始之前,先来看下项目的整体结构. flask/ ├── app │ ├── forms.py │ ├── __init__.py │ ├── mod ...

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

    Flask从入门到做出一个博客的大型教程(四) 在开始之前,先来看下项目的整体结构. flask ├── app │ ├── forms.py │ ├── __init__.py │ ├── mode ...

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

    https://blog.csdn.net/u014793102/article/category/7661475

  4. hexo 环境变量_小白使用 Github + Hexo 从 0 搭建一个博客

    最近有几位同学在公众号后台留言问我的博客站是怎么建站的,思来想去,还是写一篇从 0 开始吧. 前置准备 我们先聊一下前置准备,可能很多同学一听说要自己搭一个博客系统,直接就望而却步.不得有台服务器么, ...

  5. 个人博客建站教程wordpress+wdcp(小白入门首选)

    原文链接:个人博客建站教程 前言: 如何搭建个人博客,以及网站呢? 今天带领大家从小白完成搭建个人博客,以及网站. 如果你不知道,请不要觉得麻烦,跟着步骤很简单就会完成. 那么准备好了,我们就开始建站 ...

  6. 【FastAPI 03】FastAPI快速搭建一个博客系统

    标题:FastAPI快速搭建一个博客系统 大家好,我是Kuls. 这是<小白学FastAPI>系列的第三篇文章. 今天我们主要讲的是FastAPI快速搭建一个博客系统. 这里可能有些小伙伴 ...

  7. 最近做了一个博客 玩玩而已 运城搜搜 www.lenovoyh.com

    最近做了一个博客 玩玩而已 运城搜搜 www.lenovoyh.com  用了以前一个没用的域名做的  现在还没排名 等待吧 呵呵 转载于:https://www.cnblogs.com/kiah/a ...

  8. 运用BT在centos下搭建一个博客论坛

    在日常的工作和学习中,我们都很希望有自己的工作站,就是自己的服务器,自己给自己搭建一个博客或者是论坛,用于自己来写博客和搭建网站论坛.现在我们就用一个简单的方法来教大家如何30分钟内部署一个博客网站. ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一 ...

最新文章

  1. 在Blender中创建真实的汽车CGI视觉动画效果
  2. Laravel 实践之路: 数据库迁移与数据填充
  3. boost::log::sinks用法的测试程序
  4. 如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service
  5. different color in Chrome Development Tool
  6. 英国法院裁定GCHQ黑客发动网络攻击并不侵犯人权
  7. 在Spring Boot应用程序中测试邮件代码
  8. Oracle 安装 检查操作系统版本 必须是 5.0 5.1 的解决办法
  9. python画图入门
  10. matlab算sma,MA-EMA-SMA-DMA 函数用法、算法、图例、区别
  11. NodeJS Stream(可读流、可写流) API解读
  12. 复变函数知识总结(1)——序言和准备知识
  13. Java EE 6 最终草案暗示了平台的未来发展方向
  14. 艾蔻智能机器人怎么连接网络_智能建筑背后的关键技术:无处不在的网络连接...
  15. 计算机虚拟化技术论文,虚拟化技术在计算机技术中的运用
  16. STM32和51最小系统原理图以及PCB板图以及元件库
  17. centos 设置为北京时间
  18. matlab中m_map工具箱绘制大圆航线
  19. Linux基本操作1
  20. chrome表单自动填充默认样式-autofill

热门文章

  1. 为什么计算机二级打不开,电脑二级网页打不开是什么回事
  2. Centos6.8 SCL 安装php7
  3. openwrt patch文件怎么用_Y.A.K.E
  4. paddleOCR 识别弯曲文本 报错的解决办法
  5. 基于W5300的高速硬件以太网解决方案
  6. R语言中的网络可视化
  7. 无盘服务器分几个盘,无盘服务器分盘
  8. linux+nginx添加rtmp,编译安装nginx添加rtmp模块
  9. (一):小白的Flink学习计划以及进度表
  10. PTA 7-1 jmu-ds-最长数字序列 (20 分)