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

0 开始之前

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

1 Hello world !

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

准备工作环境

  1. duke@coding:~$ mkdir flask_tutorial
  2. duke@coding:~$ cd flask_tutorial/
  3. duke@coding:~/flask_tutorial$ virtualenv --no-site-package venv
  4. Using base prefix '/home/duke/.pyenv/versions/3.6.4'
  5. New python executable in /home/duke/flask_tutorial/venv/bin/python3.6
  6. Also creating executable in /home/duke/flask_tutorial/venv/bin/python
  7. Installing setuptools, pip, wheel...done.
  8. duke@coding:~/flask_tutorial$ source venv/bin/activate
  9. #进入Python虚拟环境
  10. (venv) duke@coding:~/flask_tutorial$
  11. (venv) duke@coding:~/flask_tutorial$ pip install flask
  12. #创建flask目录
  13. (venv) duke@coding:~/flask_tutorial$ mkdir flask
  14. (venv) duke@coding:~/flask_tutorial$ cd flask/
  15. (venv) duke@coding:~/flask_tutorial/flask$

正式开始

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

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

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

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

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

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

app/routes.py : 主页路由

  1. #从app模块中即从__init__.py中导入创建的app应用
  2. from app import app
  3. #建立路由,通过路由可以执行其覆盖的方法,可以多个路由指向同一个方法。
  4. @app.route('/')
  5. @app.route('/index')
  6. def index():
  7. return "Hello,World!"

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

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

myblog.py : 项目入口

  1. #从app模块中导入app应用
  2. from app import app
  3. #防止被引用后执行,只有在当前模块中才可以使用
  4. if __name__=='__main__':
  5. app.run()

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

  1. flask
  2. ├── app
  3. ├── __init__.py
  4. └── routes.py
  5. └── myblog.py

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

  1. (venv) duke@coding:~/flask_tutorial/flask$ export FLASK_APP=myblog.py
  2. (venv) duke@coding:~/flask_tutorial/flask$ flask run
  3. * Serving Flask app "myblog.py"
  4. * Environment: production
  5. WARNING: Do not use the development server in a production environment.
  6. Use a production WSGI server instead.
  7. * Debug mode: off
  8. * 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 : 返回一个网页

  1. from app import app
  2. @app.route('/')
  3. @app.route('/index')
  4. def index():
  5. user = {'username':'duke'}
  6. html = '''
  7. <html>
  8. <head>
  9. <title>Home Page - Microblog</title>
  10. </head>
  11. <body>
  12. <h1>Hello, ''' + user['username'] + '''!</h1>
  13. </body>
  14. </html>
  15. '''
  16. return html


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

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

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

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{{ title }} - 博客</title>
  6. </head>
  7. <body>
  8. <h1> Hello ,{{ user.username }} !</h1>
  9. </body>
  10. </html>

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

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

  1. #导入模板模块
  2. from flask import render_template
  3. from app import app
  4. @app.route('/')
  5. @app.route('/index')
  6. def index():
  7. user = {'username':'duke'}
  8. #将需要展示的数据传递给模板进行显示
  9. return render_template('index.html',title='我的',user=user)

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

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

  1. <!DOCTYPE html>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. {% if title %}
  6. <title>{{ title }} - 博客</title>
  7. {% else %}
  8. <title>欢迎来到博客!</title>
  9. {% endif %}
  10. </head>
  11. <body>
  12. <h1>Hello, {{ user.username }}!</h1>
  13. </body>
  14. </html>

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

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

  1. from flask import render_template
  2. from app import app
  3. @app.route('/')
  4. @app.route('/index')
  5. def index():
  6. user = {'username':'duke'}
  7. posts = [
  8. {
  9. 'author':{'username':'刘'},
  10. 'body':'这是模板模块中的循环例子~1'
  11. },
  12. {
  13. 'author': {'username': '忠强'},
  14. 'body': '这是模板模块中的循环例子~2'
  15. }
  16. ]
  17. return render_template('index.html',title='我的',user=user,posts=posts)

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

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

  1. <!DOCTYPE html>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. {% if title %}
  6. <title>{{ title }} - 博客</title>
  7. {% else %}
  8. <title>欢迎来到博客!</title>
  9. {% endif %}
  10. </head>
  11. <body>
  12. <h1>你好呀, {{ user.username }} !</h1>
  13. {% for post in posts %}
  14. <div><p>{{ post.author.username }} 说:<b>{{ post.body }}</b></p></div>
  15. {% endfor %}
  16. </body>
  17. </html>


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

创建一个基类模板

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

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

  1. <!DOCTYPE html>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. {% if title %}
  6. <title>{{ title }} - 博客</title>
  7. {% else %}
  8. <title>欢迎来到博客!</title>
  9. {% endif %}
  10. </head>
  11. <body>
  12. <div>博客 : <a href="/index">首页</a></div>
  13. {% block content %}
  14. {% endblock %}
  15. </body>
  16. </html>

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

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

  1. {% extends 'base.html' %}
  2. {% block content %}
  3. <h1>你好呀, {{ user.username }} !</h1>
  4. {% for post in posts %}
  5. <div><p>{{ post.author.username }} 说:<b>{{ post.body }}</b></p></div>
  6. {% endfor %}
  7. {% endblock %}

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

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

  1. [python][flask] Flask 入门(以一个博客后台为例)

    目录 1.安装 1.1 创建虚拟环境 1.2 进入虚拟环境 1.3 安装 flask 2.上手 2.1 最小 Demo 2.2 基本知识 3.解构官网指导 Demo 3.1 克隆与代码架构分析 3.2 ...

  2. flask 真是太棒啦,阅读手册后就能做出一个博客了

    真是很好的东西,有很多有益处的东西. 有template引擎, 有flask自己带的g (用来处理访问与数据库打开关闭的) 有flask自己的处理session的功能 自带的jinja2模板引擎也是比 ...

  3. 推荐csdn里的几篇activiti基础入门及提高的博客

    昨天有个网友加qq询问我有没有非maven搭建的activiti项目的demo,因为我博客中写了一个用maven,我当时没有,于是晚上回家尝试了一下,结果比较容易就实现了. 之后和那个网友聊了一下,他 ...

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

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

  5. 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?

    前言 OK,我也来造轮子了 博客系统从一开始用WordPress,再到后来用hexo.hugo之类的静态博客生成放github托管,一直在折腾 折腾是为了更好解决问题,最终还是打算自己花时间搞一个好了 ...

  6. 【网站开发】在新浪SAE上搭建一个博客

    概述 在新浪SAE上搭建一个博客 1.访问新浪SAE站点 http://sae.sina.com.cn/ 2.注册新浪SAE 3.选择应用仓库 4.选择WordPress 5.安装WordPress ...

  7. FPGA一个博客学习

    FPGA一个博客学习 http://bbs.ednchina.com/BLOG_PERSONALCAT_100185_2001619.HTM

  8. Django完整的开发一个博客系统

    今天花了一些时间搭了一个博客系统,虽然并没有相关于界面的美化,但是发布是没问题的. 开发环境 操作系统:windows 7 64位 Django: 1.96 Python:2.7.11 IDE: Py ...

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

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

随机推荐

  1. Alembic Migrations

    Introduction The migrations in the alembic/versions contain the changes needed to migrate from older ...

  2. Python中如何从数据库把数据导入excel中

    import pymysql,xlwt #1.连接mysql #2.执行sql语句 #3.获取到sql执行结果 #4.写入excel def conn_mysql(sql): conn = pymys ...

  3. L100

    The world’s lightest wireless flying machine lifts off1Circult: cutting the circuitry from copper fo ...

  4. IDEA-Eclipse结构项目转移到 Idea教程

    1.确定Idea的svn配置 2.从svn导出项目 3.检出项目完成,开始设置 4.配置完成,设置svn忽略文件,忽略掉idea配置文件等 5. 设置完毕

  5. linux命令学习笔记(17):whereis 命令

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和 源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度 ...

  6. mongodb 学习资料

    1 入门 http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html http://www.cnblogs.com/hoo ...

  7. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  8. RS-485半双工延时问题

    学习485总线时,遇到延时问题,困扰很久.通过学习知道了485半双工收发时必须延时,以保证系统的稳定性.可靠性.好多资料都介绍了485 防静电.抗干扰电路.惟独没提 每一帧收发停止位(或第9位)的延时 ...

  9. PowerDesigner生成CDM模型

    一.新建概念数据模型  1)选择File-->New,弹出如图所示对话框,选择CDM模型(即概念数据模型)建立模型. 2)完成概念数据模型的创建.以下图示,对当前的工作空间进行简单介绍.(以后再 ...

  10. 网站跳转到Apache 2 Test Page powered by CentOS

    原来是80端口被占用的问题 解决80端口占用问题 sudo fuser -n tcp -k 覆盖原来的httpd cp /usr/local/apache2/bin/apachectl /etc/in ...