本项目全部在虚拟环境中运行,因此请参照前面的文章,链接为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 %}

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

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. Hive- 表

    在hive中表的类型:管理表和托管表(外部表). 内部表也称之为MANAGER_TABLE,默认存储在/user/hive/warehouse下,也可以通过location指定:删除表时,会删除表的数 ...

  2. mvc购物车项目(2)

    为了避免数据冗余,我们可以把共同的信息,抽出建立一个单独的表,把不是共有的信息,建立一张单独表. 订单表分为两个表 create table orders( id number primary key ...

  3. 分享知识-快乐自己:SSH 整合 Demo

    楼主A: XML 版 SSH整合Demo https://github.com/MlqBeginner/BlogGardenWarehouse/blob/master/SSH%E6%95%B4%E5% ...

  4. Runtime Error(ACCESS_VIOLATION)

    1.     while(scanf("%d",&n) )// 错误,会出现  Runtime Error(ACCESS_VIOLATION) while(scanf(&q ...

  5. 更新github上代码

    前面一篇已经实现首次上传代码到github了,本篇继续讲如何把本地更新的代码同步更新到github上 一.clone代码 1.把大神的代码clone到本地,或者clone自己github上的代码,使用 ...

  6. 【leetcode刷题笔记】Integer to Roman

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...

  7. C#中如何获取汉字的笔画数和汉字的拼音

    以前玩过一个游戏,输入两个人的名字然后点击缘分就能产生一段缘分测试的结果,后来经过分析知道是根据名字笔画数之差来弄的小游戏,于是就在百度上找怎么得到汉字的笔画数,也没找到自己想要的答案,问遍了所有的人 ...

  8. 【转】 Pro Android学习笔记(二七):用户界面和控制(15):FrameLayout

    FrameLayout FrameLayout通常只包含一个控件.如果我们在FrameLayout中设置多个控件,则第二个控件会堆叠在第一个控件上面,如此类推,一层一层地叠上去.下面的例子,我们在Fr ...

  9. css动画和渐变

    变形: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元素的变形:transform transform:none | <tra ...

  10. linux下go的动态链接库的使用

    转自:http://blog.csdn.net/xtxy/article/details/21328143 在使用lua进行服务器端游戏逻辑开发时,发现了LUA的各种不方便的地方,不能编译检查,不能断 ...