flask 高级编程-基础

时间:2019-05-11 09:51来源:计算机教程
1、安装python3的虚拟环境 阅读目录 1、系统环境,必要知识 2、安装python3.6.5 3、安装uWSGI 4、安装nginx 5、安装Django 6、MySQL安装配置 which python 1、系统环境,必要知识 /usr/local/bin/python3 #

1、安装python3的虚拟环境

阅读目录
1、系统环境,必要知识
2、安装python3.6.5
3、安装uWSGI
4、安装nginx
5、安装Django
6、MySQL安装配置

  which python

1、系统环境,必要知识

  /usr/local/bin/python3

#cat /etc/RedHat-release
CentOS Linux release 7.5.1804 (Core)
#uname -r
3.10.0-862.3.2.el7.x86_64

  virtualenv -p /usr/local/bin/python3 env

暂时关闭防护墙,关闭selinux:

2、查看版本

#systemctl stop firewalld.service
#setenforce 0
#getenforce
Permissive

  python -V

准备知识:

  pip -V

django:一个基于python的开源web框架。

3、安装flask

uWSGI:一个基于自有的uwsgi协议,wsgi协议和http服务协议的web网关

  pip install flask

nginx:高性能的代理web服务器

4、常用virtual命令

wsgi.py:django项目自带的wsgi接口文件(位于:项目/项目名/wsgi.py)

  virtualenv env 创建虚拟环境

整个项目流程:

  deactivate 退出虚拟环境

首先客户端通过浏览器访问服务器资源;nginx作为对外服务的端口(80),nginx接收到客户端http请求后会解包分析,如果是静态文件就去配置的静态文件中查找资源并返回给客户端,如果是动态资源,nginx就通过配置文件将请求传递给uwsgi处理,并转发给uwsgi,wsgi根据请求调用django工程的文件和函数,处理后django将返回值交给wsgi,wsgi将返回值进行打包,转发给uWSGI,uWSGI接收到数据后转发给nginx,最终返回给客户端。

  pip freeze > requirements.txt 自动生成requirements.txt文件

2、安装python3.6.5

5、mysql安装(centos7)

(1)安装python依赖包

  su root  # 切换到root用户

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel python-devel

  wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm # 下载mysql安装包

(2)安装python

  yum -y install mysql57-community-release-el7-10.noarch.rpm # 安装mysql源

#wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
#mkdir -p /usr/local/python356
#tar zxvf Python-3.6.5.tgz
#cd Python-3.6.5
#./configure --prefix=/usr/local/python356
#make
#make install
#ln -s /usr/local/python356/bin/python3 /usr/local/bin/python3
#ln -s /usr/local/python356/bin/pip3 /usr/local/bin/pip3
#pip3 install --upgrade pip  #更新pip
#pip3 install ipython  #安装ipython方便调试

  yum -y install mysql-community-server # 安装mysql

测试安装是否正常:

  systemctl start mysqld.service # 启动

#python3 -V
Python 3.6.5

  systemctl status mysqld.service # 查看状态,有active (running)

#pip3 -V
pip 10.0.1 from /usr/local/python356/lib/python3.6/site-packages/pip (python 3.6)

  grep "password" /var/log/mysqld.log # 查找root密码

3、安装uWSGI

  mysql -uroot -p # 登录客户端,输入密码

使用python的pip工具包安装:

  设置

#pip3 install uwsgi

    set global validate_password_policy=0;

#ln -s /usr/local/python356/bin/uwsgi /usr/local/bin/uwsgi  #建立软链接
#uwsgi --version  #检查安装成功
2.0.17

    set global validate_password_length=1;

建立uWSGI的配置文件,在django项目中建立uwsgi.ini文件:

    ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

[uwsgi]
socket = 127.0.0.1:9090
chdir = /djproject/mysite
module = mysite.wsgi    #这里填的是相对路径
master = true
processes = 2
threads = 2
max-requests = 2000
vacuum = true
daemonize = /djproject/mysite/uwsgi.log
stats = 127.0.0.1:9001
post-buffering = 65535
buffer-size = 65535
harakiri-verbose = true
harakiri = 300
uid = nginx
pidfile = /djproject/mysite/uwsgi.pid

  exit

参数说明:

  yum -y remove mysql57-community-release-el7-10.noarch  # 卸载更新,因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉

socket:指定监听地址和端口

6、mysql基础用法

chdir:指定工程的绝对路径,如Django的项目路径

  systemctl start mysqld.service # 启动

module:指定web应用的入口模块,如Django项目下的wsgi.py接口文件

  systemctl status mysqld.service # 查看状态,有active (running)

master:启动主进程

  mysql -uroot -p # 登录

processes:启动进程数

7、fisher.py

threads:启动线程数

 

max-requests:最大请求数

图片 1图片 2

daemonize:指定uWSGI日志文件路径

# -*- coding=utf-8 -*-

from flask import Flask

app = False(__name__)


@app.route('/hello')
def hello():
return 'Hello, World!'


app.run()

stats:指定状态查询端口,如:127.0.0.1:9001

View Code

wsgi-file:指定启动的文件

  

post-buffering:设置缓冲区

  其中,MVC中的controller就是这里面的hello函数

buffer-size:设置缓冲区文件大小

  python fisher.py

harakiri-verbose:设置超时true为开启

8、兼容两种访问方式,带/和不带/

harakiri:设置超时时间

  8.1 浏览器中输入http://127.0.0.1:5000/hello就能访问

uid、gid:设置用户和组

    要想输入http://127.0.0.1:5000/hello/也能访问,@app.route('/hello')-->@app.route('/hello/')

pidfile:指定启动时的pid文件路径

  8.2 原理:重定向,将不带/的url重定向到了带/的url这里

uwsgi信号控制:

    (1)浏览器访问url1地址,服务器接收到这次请求

HUP    :优雅的重新加载所有进程和配置,同(--reload)一样

    (2)出于某种原因(没有url所在页面或者不想让你访问url1所对应页面)

TERM  :强制重新加载主进程和配置

    (3)服务器会在返回的header里面增加一个标志位,location:url2,同时将返回的状态码更改为301或者302

 INT  :立即杀死整个uWSGI;同于:--stop

    (4)当浏览器接收到返回之后,首先会去看状态码,如果是301或者302,浏览器会再次发送一个请求,请求地址为url2

QUIT  :立即杀死真个uWSGI

  8.3 为了保证url的一致性,seo引擎优化

重新启动实例:

9、本地自动重启,开启调试模式

#kill -HUP `cat /tmp/project-mast.pid`

  app.run(debug=True)

#uwsgi --reload /tmp/project-master.pid

10、另一种路由注册方法

还可以在python程序中使用uwsgi.reload()重新加载

 

停止服务器:

图片 3图片 4

#uwsgi --stop /tmp/project-master.pid

# -*- coding=utf-8 -*-

from flask import Flask, make_response

app = Flask(__name__)
app.config.from_object('config')


def hello():
    headers = {
        'content-type': 'application/json',
    }
    return '<html></html>', 200, headers

app.add_url_rule('/hello', view_func=hello)


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=app.config['DEBUG'], port=5000)

#kill -INT `cat /tmp/project-master.pid`

View Code

编写启动脚本:

  

#vim /etc/init.d/uwsgi

  注释掉@app.route('/hello')

#!/bin/bash
#this is uwsgi server script

  方法下面,添加app.add_url_rule('/hello', view_func=hello),类视图需要使用这种方式

. /etc/init.d/functions

11、启动配置

uwsgi=/usr/local/bin/uwsgi
uwsgi_pid=/djangoproject/mysite/uwsig.pid
uwsgi_conf=/djangoproject/mysite/uwsigconf.ini
uwsgi_pn=`ps -ef|grep -v "grep"|grep -c "uwsgi"`
ERVAL=0
start(){
    $uwsgi --ini $uwsgi_conf >& /dev/unll
    ERVAL=$?
    if [ $ERVAL -eq 0 ];then
        action "uwsgid starting ..." /bin/true
    else
        action "uwsgid start is error" /bin/false
    fi
}

  app.run(host='0.0.0.0', debug=True) # 允许外网访问

stop(){
    $uwsgi --stop $uwsgi_pid >& /dev/null
    ERVAL=$?
    if [ $ERVAL -eq 0 ];then
        action "uwsgid stoping ..." /bin/true
    else
        action "uwsgid stop is error" /bin/false
    fi
}

  app.run(host='0.0.0.0', debug=True, port=8888) # 修改端口号

case "$1" in
    start)
        if [ $uwsgi_pn -ge 5 ];then
            action "uwsgi is running!" /bin/false
        else
            start
            ERVAL=0
        fi
        ;;
    stop)
        if [ $uwsgi_pn -ge 5 ];then
            stop
            ERVAL=0
        else
            action "uwsgi no running!" /bin/false
        fi
        ;;
    reload)
        if [ $uwsgi_pn -ge 5 ];then
            $uwsgi --reload $uwsgi_pid >&/dev/null
            ERVAL=$?
            [ $ERVAL -eq 0 ] && action "uwsgi reloading ..." /bin/true
        else
            action "uwsgi reload error" /bin/false
        fi
        ;;
    restart)
        stop
        sleep 2
        start
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        ERVAL=2
esac
exit $ERVAL

12、正式环境不能开启调试模式原因

 centOS7 system系统服务脚本:

  (1)调试模式使用的是flask自带的服务器,性能差

#cat uwsgi.service
[Unit]
Description=uwsgi service
After=network.target

  (2)不能向用户展示任何网站的详细信息

[Service]
Type=forking
PIDFile=/run/uwsgi.pid
ExecStartPre=/usr/bin/rm -f /run/uwsgi.pid
ExecStart=/usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

13、配置文件

[Install]
WantedBy=multi-user.target

  正式环境和测试环境要保持镜像关系,就是代码一样

测试服务:

  config.py

#uwsgi --ini /djproject/mysite/uwsgi.ini    #启动服务

  DEBUG = True

#ps -ef|grep "uwsgi"  #查看进程
root    103596      1  2 16:02 ?        00:00:00 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
root    103598 103596  0 16:02 ?        00:00:00 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
root    103599 103596  0 16:02 ?        00:00:00 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini

(1)配置文件中的配置都要大写,相当于常量,常量一般都大写

#netstat -lntp|grep "uwsgi"
tcp        0      0 127.0.0.1:9090          0.0.0.0:*              LISTEN      103596/uwsgi       
tcp        0      0 127.0.0.1:9001          0.0.0.0:*              LISTEN      103596/uwsgi

  

看上面进程是少了一个主进程,通过systemctl 查看就清楚了:

图片 5图片 6

#systemctl status -l uwsgi.service
● uwsgi.service - uwsgi service
  Loaded: loaded (/usr/lib/systemd/system/uwsgi.service; disabled; vendor preset: disabled)
  Active: active (running) since 五 2018-05-25 16:02:06 CST; 4min 14s ago
  Process: 103593 ExecStart=/usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini (code=exited, status=0/SUCCESS)
  Process: 103591 ExecStartPre=/usr/bin/rm -f /run/uwsgi.pid (code=exited, status=0/SUCCESS)
 Main PID: 103596 (uwsgi)
  CGroup: /system.slice/uwsgi.service
          ├─103596 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
          ├─103598 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
          └─103599 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini

# -*- coding=utf-8 -*-

from flask import Flask

app = Flask(__name__)
app.config.from_object('config') # 载入配置文件,为模块路径


@app.route('/hello/')
def hello():
return 'Hello, World!'


app.run(host='0.0.0.0', debug=app.config['DEBUG'], port=8888)

5月 25 16:02:06 ZPY systemd[1]: Starting uwsgi service...
5月 25 16:02:06 ZPY uwsgi[103593]: [uWSGI] getting INI configuration from /djproject/mysite/uwsgi.ini
5月 25 16:02:06 ZPY systemd[1]: PID file /run/uwsgi.pid not readable (yet?) after start.
5月 25 16:02:06 ZPY systemd[1]: Started uwsgi service.

View Code

4、安装nginx

 

这里采用yum安装nginx:

(2)注:

yum -y install nginx

  如果将config.py中的DEBUG改为Debug,读取app.config['Debug']报错,from_object要求必须大写;

配置nginx与uwsgi代理:

  如果config.py中为Debug = True,取的时候app.config['Debug']为False,因为Debug在flask中默认为False,就算没有设置,取值也为False

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

14、if __name__ == '__main__'

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

  14.1 如果入口文件中增加了这个判断之后,能够确保if里面的语句只在入口文件执行;

events {
    worker_connections 1024;
}

  14.2 如果当前的fisher.py文件不是作为入口文件直接被执行的,而是被其他模块导入的,下面的语句由于if的存在而不会被执行

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

  14.3 部署到生产环境不会使用flask自带的服务器,而是nginx uwsgi

    access_log  /var/log/nginx/access.log  main;

    生产环境使用uwsgi启动程序,fisher.py只是作为一个模块被传入,加上if判断,uwsgi启动的时候app.run便不会被执行,确保了安全性

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay        on;
    keepalive_timeout  65;
    types_hash_max_size 2048;

编辑:计算机教程 本文来源:flask 高级编程-基础

关键词: