python flask 小项目
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$1234567891011121314151617181920
正式开始
(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__.py12345
在_ _ init _ _.py中写如下代码,你可以使用pycharm,vscode等IDE来更快的书写代码。
app/_ _ init _ _.py : 项目初始化
from flask import Flask
#创建app应用,__name__是python预定义变量,被设置为使用本模块.
app = Flask(__name__)
#如果你使用的IDE,在routes这里会报错,因为我们还没有创建呀,为了一会不要再回来写一遍,因此我先写上了
from app import routes12345
创建路由模块,你可以使用IDE直接新建,没有必要要使用命令行创建
(venv) duke@coding:~/flask_tutorial/flask/app$ touch routes.py1
app/routes.py : 主页路由
#从app模块中即从__init__.py中导入创建的app应用
from app import app
#建立路由,通过路由可以执行其覆盖的方法,可以多个路由指向同一个方法。
@app.route('/')
@app.route('/index')
def index():
return "Hello,World!"12345678
现在基本都齐全了,但是我们还是需要在app模块之外创建一个主入口,即执行这个主入口就可以达成运行整个项目的目的。
(venv) duke@coding:~/flask_tutorial/flask/app$ cd ..
(venv) duke@coding:~/flask_tutorial/flask$ touch myblog.py12
myblog.py : 项目入口
#从app模块中导入app应用
from app import app
#防止被引用后执行,只有在当前模块中才可以使用
if __name__=='__main__':
app.run()123456
现在整个小demo就完成了,结构应该是这样的
flask
├── app
│ ├── __init__.py
│ └── routes.py
└── myblog.py12345
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)
12345678910
在浏览器里输入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 html123456789101112131415161718
如图所示,这样就完成了返回网页的目的,但是这样实在是太麻烦了,因此肯定有解决这个问题的办法喽。对,模板就是解决这个问题的办法。
(venv) duke@coding:~/flask_tutorial/flask$ mkdir app/templates
#在新建的templates中新建一个index.html
(venv) duke@coding:~/flask_tutorial/flask/app/templates$ touch index.html123
app/templates/index.html : 主页模板,将数据显示在其中
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ title }} - 博客</title>
</head>
<body>
<h1> Hello ,{{ user.username }} !</h1>
</body>
</html>12345678910
这里出现{{ }} 意味着变量,可以接受数据的地方。既然在这里写了变量,那么就要在路由中修改对应的格式,因为要把数据返回才可以。
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)12345678910
从新运行后,效果还是符合预期的。但是,如果你传递至模板的数据是空的,那页面显示岂不是很难看?因此我们需要在模板中加上一些判断,看数据是否为空。
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>1234567891011121314
如果传进来的数据很多,那么就可以使用循环来展示数据。首先,还是对路由里的方法进行修改。
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)12345678910111213141516171819
增加了这些数据之后要对模板中的结构进行一些修改。
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>123456789101112131415161718
我们发现,每次修改页面都是要有很多重复的不必要代码,因此把重复的代码放到一个基类模板里,在里面留上占位符,这样只需要修改其中一部分就可以了,十分方便。
创建一个基类模板
(venv) duke@coding:~/flask_tutorial/flask/app/templates$ touch base.html1
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>1234567891011121314151617
那么这有什么作用呢?注意这里面有{% 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 %}
---------------------
python flask 小项目的更多相关文章
- Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验
(一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...
- 记一次python + selenium小项目出现的问题与解决办法
记一次python + selenium小项目出现的问题与解决办法 如何接入代理 def crawl_xdaili(self):#代理 可不用 需要时 解除注释 """ ...
- 学习笔记之Python人机交互小项目一:名字管理系统
2020是一个不平凡的一年,但即使挫折不断,我们每学期的课程实训也没有受到影响,仍旧如期实施.与往年不同的是,今年的实训老师是学校邀请的公司在职人员来给我们实训.今年实训的内容是Python语言,下面 ...
- 学习笔记之Python人机交互小项目二:名片管理系统
继上次利用列表相关知识做了简单的人机交互的小项目名字管理系统后,当学习到字典时,老师又让我们结合列表和字典的知识,结合一起做一个名片管理系统,这里分享给在学习Python的伙伴! 1.不使用函数 1 ...
- 找python爬虫小项目?github给你准备好了!
前言 即使我们都是程序员,但我们也并非都会修电脑,都会做酷炫的ppt,都会优化系统卡顿.其实程序员也是分行业.分专业的,就像医生也分内外科.呼吸科.神经科神的. 作为非专业的python选手,或者非专 ...
- python flask大型项目目录
Hello World 作者背景 应用程序简介 要求 安装 Flask 在 Flask 中的 “Hello, World” 下一步? 模板 回顾 为什么我们需要模板 模板从天而降 模板中控制语句 模板 ...
- python爬虫小项目实战
- Python之Flask框架项目Demo入门
Python+Flask框架项目Demo入门 本例子用到了 Flask+蓝图+Flask-Login+SQLAlchemy+WTForms+PyMySQL相关架构 Flask Web框架介绍 Flas ...
- VisualStudio2013下安装Python Flask/jade
为什么是Python? 不做程序的工作好久了,当创业成为工作后越发发现时间的宝贵.时间那么少,需求确实多样的,软件的,web的,还得跨平台,以前熟悉的.Net明显每一项满足的.选来选去还是Python ...
随机推荐
- python记录_day10 动态传参 命名空间 作用域
一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...
- MySQL 分页查询和存储过程
一.分页查询 使用limit函数,limit关键字的用法: LIMIT [offset,] rows: offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目.初始行的偏移量是0( ...
- python-day2笔记
# 1.为何要有操作系统:# 程序员掌握计算机系统所有的细节有很大难度,并且管理这些部件并加以优化使用,是一件极富挑战性的工作,# 于是,计算机安装了一层软件(系统软件),称为操作系统.它的任务就是为 ...
- Linux 环境下 网络IO模型
本文讨论的背景是Linux环境下的network IO. IO发生时涉及的对象和步骤: 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的proce ...
- 记录一下ES6扩展运算符(三点运算符)...的用法
...运算符用于操作数组,有两种层面 1. 第一个叫做 展开运算符(spread operator),作用是和字面意思一样,就是把东西展开.可以用在array和object上都行. 比如: let a ...
- 通过配置hosts.allow和hosts.deny文件允许或禁止ssh或telnet操作
1.登录主机,如果是普通账户先切换至root账号 su root 2.编缉/etc/hosts.allow文件 vi /etc/hosts.allow 允许内容 书写格式(改成自自需要的IP或IP段) ...
- nginx补丁格式说明(CVE-2016-4450为例)
nginx安全公告地址:http://nginx.org/en/security_advisories.html CVE-2016-4450:一个特定构造的数据包,可引发nginx引用空指针,导致ng ...
- ci框架url去掉index.php
去掉index.php: 1.修改配置文件, $config['index_page'] = ' '; 设置空 2.修改Apache,搜索 htaccess 将 AllowOverride None ...
- learning rndis protocol
reference: https://docs.microsoft.com/en-us/windows-hardware/drivers/network/overview-of-remote-ndi ...
- day20-正则表达式练习
import re from re import findall,search,S secret_code = 'hadkfalifexxIxxfasdjifja134xxlovexx23345sdf ...