文章目录
- 一、架构简介
- 1、什么是Flask?
- 2、Flask的优势
一、架构简介
- Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
- uWSGI是一个Web服务器,它实现了WSGI(Web服务器网关接口)协议、uwsgi、http等协议。
- Framework即架构,它是一个语言开发软件,提供了软件开发的框架,使开发更具工程性、简便性和稳定性。
注意:Nginx能够和浏览器直接传输,但Flask不能够直接和Nginx传输,Flask与Nginx连接需要中间人uWSGI搭线连接,uWSGI在与Nginx通过http协议进行传输,uWSGI与Flask之间传输时通过WGSI协议,这样Flask就能与Nginx之间进行传输了。进而连接到浏览器。
Nginx能够访问静态页面,如果是动态页面,比如后台需要登录验证,注册等提交数据,逻辑处理等需要wsgi。
1、什么是Flask?
Flask是一个Web框架,就是提供一个工具,库和技术来允许你构建一个Web应用程序.这个Web应用程序可以是一些Web页面,博客, wiki ,基于 Web 的日历应用或商业网站。
Flask依赖模块:web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI
- Werkzeug 一个WSGI工具包, 是为python语言定义的web服务器和web应用程序或框架之间的一种简单而通用的借口,其他语言也有类似的接口)
- jinja2模板引擎
2、Flask的优势
Flask属于微框架( micro-framework )这一类别,微架构通常是很小的不依赖外部库的框架.
- 框架很轻量
- 更新时依赖小
- 专注于安全方面的bug
先写一个简单的Flask网页,默认端口是5000,运行之后在浏览器中访问即可:
1、第一个Flask网页:
from flask import Flask
app = Flask(__name__)
# 实现首页:http://localhost:9999、
@app.route('/') # 路由
def index(): # 视图函数,一定不能重复
return "这是网站首页"
@app.route('/login/')
def login():
return "正在登陆......"
@app.route('/logout/')
def logout():
return "正在登出......"
if __name__ == '__main__':
# 运行Flask项目,默认ip和端口是127.0.0.1:5000
# 如何特色化指定? host="0.0.0.0" 开放本机的所有ip,port=5000 ,端口必须是整形数
# debug=True:是否开启调试模式,测试环境中开启,生产环境中关闭
# app.run(host='0.0.0.0',port=9999,debug=True)
app.run()
2、路由变量规则: 当我们访问如下网页时,,,,一次次的输入网址是很麻烦的一件事,当我们设置动态路由之后,可以像这样访问,方便访问也方便代码的修改
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/<int:userid>/')
def usrinfo(userid):
return "正在访问%s的博客"%(userid)
@app.route('/welcome/<string:username>/')
def welcome(username):
return "欢迎访问%s的主页" %(username)
@app.route('/top250')
def top250():
users = ['user%s' %(i) for i in range(100)]
# request存储用户请求页面的所有头部信息
print("客户端的代理信息: ",request.user_agent)#Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
print("请求页面的头部信息: ",request.headers) #Host: 127.0.0.1:5000
print("客户端的IP:",request.remote_addr) #127.0.0.1
print("客户端请求的参数详细信息: ",request.args) #ImmutableMultiDict([('start', '20'), ('user', 'westos')])
print("客户端HTTP请求方法:",request.method) #GET
# 获取请求的url地址里面key对应的value值
start = int(request.args.get('start')) #'20'字符串
user = request.args.get('user') #'westos'
# return 'top250 显示数据开始:%s条 用户名:%s' %(start,user)
return json.dumps(users[start:start+10])
if __name__ == '__main__':
app.run()
3、登录验证之http请求方法GET:
通过GET方法写一个简单的登录页面:
from flask import Flask, render_template, request, redirect
app = Flask(__name__)
@app.route('/')
def index():
return "<h1>主页</h1>"
@app.route('/login/')
def login():
"""
一般情况下,不会直接把html文件内容直接返回
而是将html文件保存到当前的templates目录中;
1). 通过render_template方法调用
2). 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板
:return:
"""
return render_template('login.html')
@app.route('/login2/')
def login2():
# 获取用户输入的用户名
username = request.args.get('username')
password = request.args.get('password')
# 逻辑判断,用来判断用户和密码是否正确
if username == 'root' and password == 'redhat':
# 重定向到指定路由
# 如果登录成功进入主页
return redirect('/')
# return '登录成功'
else:
# 如果登录失败,重定向到登录界面重新登录
# return '登录失败'
return redirect('/login/')
if __name__ == '__main__':
app.run()
4、登录验证之http请求方法POST:
自定义错误页面:
1). 为什么要自定义错误页面?
如果你在浏览器地址栏里面输入不可用的路由,那么会显示一个状态为404的错误页面。
2). 如何自定义错误页面?
像常规路由一样,Flask允许程序使用基于模板的自定义错误页面
最常见的错误代码有两个:
--404,客户端请求未知页面或者路由时显示
--500,有未处理的异常时显示
from flask import Flask, request, redirect, render_template, abort
app = Flask(__name__)
@app.route('/')
def index():
return '这是主页'
#默认路由只支持get方法,如何指定接受post方法呢?
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'POST':
# post请求提交的数据如何获取? request.form.get
# get 请求提交的数据如何获取? request.args.get
username = request.form.get('username')
password = request.form.get('password')
#如果用户名称和密码正确跳转到主页
if username == 'root' and password == 'redhat':
return redirect('/')
# 如果登录不正确,则警告红色信息,还是在登录页面
else:
return render_template('login_post.html',
errMessages='用户名或密码错误')
else:
# abort(500)
return render_template('login_post.html')
@app.route('/welcome/<string:username>')
def welcome(username):
return render_template('welcome.html', name=username)
@app.errorhandler(404)
def page_not_found(e):
return render_template("404.html"),404
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'),500
if __name__ == '__main__':
app.run()
5、Flask日志记录
格式化中的常用参数如下:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息
from flask import Flask
import logging
app = Flask(__name__)
# 日志系统配置,设置日志文件存放位置
handler = logging.FileHandler('app.log',encoding='utf-8')
# 设置日志文件存储格式
logging_format = logging.Formatter(
'%(asctime)s-%(levelname)s-%(filename)s-%(funcName)s-%(lineno)s-%(message)s')
#将日志文件处理对象和日志格式绑定
handler.setFormatter(logging_format)
# 将日志格式和app绑定
app.logger.addHandler(handler)
@app.route('/')
def index():
app.logger.debug('hello')
app.logger.error('hello')
app.logger.exception('hello')
app.logger.info('hello')
return 'index'
if __name__ == '__main__':
app.run(debug=True,port=8000)