课程基于Python Flask框架——全栈开发中的免费章节。
1.python3.6或者2.7的安装请参考百度资料
2.通过在cmd中键入下行命令安装虚拟环境 pip install virtualenv
3.激活虚拟环境
cmd下键入
mkdir Virtualenv (创建一个名为Virtualenv的文件夹)
cd Virtualenv (进入该文件夹)
virtualenv flask-env (创建一个虚拟环境,安装一个名为flask-env的软件)
cd flask-env
cd Scripts
activate
然后出现
(flask-env) C:\Users\UserName\Virtualenv\flask-env\Scripts>
则激活成功
4.在 cmd 下键入
pip install flask==0.12.2(安装特定版本(0.12.2)的flask)
python
import flask
print(flask._version_)
出现版本号则说明安装成功
打开PyCharm ——> 新建项目,位置随意,名称最好不要出现中文
左侧选择Flask(PyCharm专业版,社区版无此功能,其他版本我不太了解)
解释器(interpreter)设置有两种情况
1.Project interpreter New Virtualenv environment
·展开Project interpreter New Virtualenv environment
·在Base interpreter中点击…(右侧省略号)
·选择C:\Users\UserName\Virtualenv\flask-env\Scripts\python.exe
2.Interpreter
·在interpreter右侧点击…(右侧省略号)
·选择C:\Users\UserName\Virtualenv\flask-env\Scripts\python.exe
点击create按钮
新建项目过后,如果你使用的是python2.x,请在代码段中的第一行添加
#encoding utf-8
因为 python2.x 使用的是ASKII编码,需要手动改成utf-8
如果你使用的是python3.x,则无需担心
它表示当前的这个项目运行在 http://127.0.0.1:5000/ 这个网站上
其中 127.0.0.1 表示本机地址,5000代表端口
打开后会发现,网页出现了"Hello World"字样
表明 return 之后的字符串表示的就是网页中显示的字样
在运行后,修改完程序,点击右上角红色按钮停止运行,之后重新运行代码方可使修改后的代码产生效果
代码解释
# 从 flask 框架中导入 Flask 这个类
from flask import Flask
# 初始化一个Flask对象
# 书写这个类的原因
# 需要传一个参数
# 1. 方便flask框架去寻找资源
# 2. 方便flask插件,例如Flask-Sqlalchemy 出现错误的时候,好去寻找问题所在的位置
app = Flask(__name__)
# @app.route是一个装饰器
# @开头为装饰器
# 装饰器的作用是做一个url与视图函数的映射
# 这句话的意思是以后你如果访问 127.0.0.1:5000/
# 到斜杠的时候,他就会去请求执行 hello_world()这个函数 让后将结果返回给浏览器
@app.route('/') # url
def hello_world(): # 视图函数
return 'Hello'
# 如果当前这个文件是作为入口程序运行
# 那么就执行app.run()
if __name__ == '__main__':
# app.run()
# 启动一个应用服务器接受用户的请求
# 它相当于是一个 while True
# 会一直监听用户的请求,对于用户的请求进行处理
app.run()
需要注意,开启调试模式会成为一个巨大的安全隐患,因此他绝对不能用于生产环境中。
Debug 模式有两个功能
1.
重新回到我们的代码段
如果你这样书写代码
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
a = 1
b = 0
c = a / b
return 'Hello'
if __name__ == '__main__':
app.run()
运行且打开网页,会出现如下图所示的错误
如图,浏览器并不会告诉你是除法出了错误,只有编译器下方的窗口中有该错误信息
我们将代码中的 app.run() 修改为
if __name__ == '__main__':
app.run(debug = True)
之后停止原先运行的程序,重新运行。
如果运行时未出现下图提示信息 [ 出现于 PyCharm 2018 (2018.5.8写) ]
则点击编译器右上侧运行符号旁边的项目名称处,选择Edit Configuration
勾选下图选项
重新打开网站便可以看到错误信息了
2.
在修改你的代码后,保存文件的同时,编译器会在下方提示你你的信息被改变了,同时网页也会重新加载变更后的代码信息。
提示信息如下图
在项目中新建python file,添加下行代码
DEBUG = True
回到原先的py文件中,删除app.run(debug = True)括号中的debug = True
修改为
from flask import Flask
# 被添加的代码
import config
app = Flask(__name__)
# 被添加的代码
app.config.from_object(config)
@app.route('/')
def hello_world():
return 'wol'
if __name__ == '__main__':
app.run()
这同样可以为该文件设置debug模式
新建项目url_params
在项目中添加一行代码,重载视图函数
@app.route('/article/' )
def article(id):
return '您请求的参数是:%s' % id
Tips:
1. 在python2.x中,需要这样书写
return u'您请求的参数是:%s' % id
在字符串之前加 u 表示将字符串进行Unicode编码
2. 参数需要放进两个尖括号之间
3. 视图函数中需要放置和url中参数同名的参数
然后运行项目,打开链接,在 http://127.0.0.1:5000/ 后面添加article/aabbcc
点击回车,页面会显示您请求的参数是:aabbcc
PS:
如果只能通过勾选debug项来改变debug模式的启动或关闭,那么不论是在run()中更改debug
模式,还是通过配置文件更改,都是无效的
正转URL的概念:通过URL取得视图函数的内容
反转则是反过来的意思,就是知道视图函数的名称,可以反转得到视图函数当前的url
新建项目url_reverse,在项目中添加下列代码
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
print(url_for('my_list'))
print(url_for('article', id = 'abc'))
return 'Hello World!'
@app.route('/list/')
def my_list():
return 'list'
@app.route('/article/' )
def article(id):
return '您请求的参数为:%s' % id
if __name__ == '__main__':
app.run(debug = True)
在执行后,控制台会打印如下图所示信息
反转URL的用处:
·在页面重定向的时候会用到
·在模板中也会使用到
重定向例子:
例如在某论坛中,用户在未登录的情况下,点击论坛中的评论,当然此时是没有办法评论的,因为用户
没有登陆,此时,页面应当跳转至登陆界面;如果你登陆过了,那么能够跳转至评论页面。
这个过程称之为重定向
新建项目redirect,添加代码
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return '这是首页'
@app.route('\login\')
def login():
return '这是登陆页面'
if __name__ == '__main__'
app.run(debug=True)
执行程序后打开链接会发现,页面中出现“这是首页”的字样
然后修改代码如下
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return redirect('/login/')
return '这是首页'
@app.route('/login/')
def login():
return '这是登陆页'
if __name__ == '__main__':
app.run(debug = True)
运行后刷新页面,发现页面直接跳入http://127.0.0.1:5000/login/
当然比较正确的写法为
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
# 博主本人理解为通过url_for找到名称为login的函数
# 然后找到这个函数装饰器中的url参数
# 将这个url参数传递给login_url,达到了url反转的功能
login_url = url_for('login')
return redirect(login_url)
return '这是首页'
@app.route('\login\')
def login():
return '这是登陆页'
if __ name__ == '__main__':
app.run(debug = True)
这样书写的好处是无论你的装饰器@app.route(’/login/’)中的url参数如何改变,
都不会导致login_url在传递参数给redirect()时出现问题。
下面我们实现一个小案例:未登录用户点击评论进入登陆页面,已登录用户进入评论页面
用“1”表示已登陆,其他表示未登录
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
login_url = url_for('login')
return redirect(login_url)
return '这是首页'
@app.route('/login/')
def login():
return '这是登陆界面'
@app.route('/commitment//' )
def commitment(is_login):
if is_login == '1':
return '这是评论页面'
else:
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True)
执行程序后,首先跳转到登陆页面,删除login/,添加commitment/1,点击回车,显示这是评论页面,输入其他数字则显示登陆页面
新建项目template01,添加代码
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run()
在下图位置可以看见
static和templates文件夹
static:用于存放一些静态资源,例如css, gs, img文件
templates:专门用于存放html文件
所以,我们在templates上右键->New file->HTML file,取名为index.html
在/body>之间添加一段文字(博主不知道怎么处理Hexo下的转移QAQ),达到如下效果
Title
这是HTML文件中出现的文字
然后回到app.py(或者你建立的主文件)
由于你添加了一个HTML文件,所以这时你就不能只渲染’index’,除此之外还要渲染HTML
这时候需要import render_template
from flask import Flask, render_template
接着删除return ‘index’,添加 return render_template(‘index.html’),括号内为刚刚新建的HTML文件
代码如下
from flask import Flask, render_templale
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == __main__:
app.run(debug = True)
'''
在render_template()中,是不需要传文件夹templates的名称的当调用render_template()时,
编译器会自动在templates文件夹下寻找与传入参数(文件名)匹配的文件,如找不到则报错
但是如果你在templates下创建了一个文件夹another,且将index.html移动进这个文件夹内,
那么这时需要你这样使用这个文件
render_template('another/index.html')
'''
运行后打开链接会发现在/body>中书写的文字显示在了网页上
接下来,我们尝试使用HTML在页面的右上角显示用户的用户名
因为显示用户名需要与数据库通信,所以不能将其写死了,不可以像下面这样书写代码
Title
这是HTML文件中出现的文字
用户名:Outro
所以我们应该试着数据库模拟传参的行为
回到app.py,在index()函数中修改render_template()
@app.route('/')
def index():
return render_template('index.html', username = Outro)
在index.html中的/body>添加
这是HTML文件中出现的文字
用户名:{{ username }}