文章目录

  • 一、架构简介
  • 1、什么是Flask?
  • 2、Flask的优势

一、架构简介

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
  • uWSGI是一个Web服务器,它实现了WSGI(Web服务器网关接口)协议、uwsgi、http等协议。
  • Framework即架构,它是一个语言开发软件,提供了软件开发的框架,使开发更具工程性、简便性和稳定性。

flask uwsgi nginx部署 flask和nginx_html


注意: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)