nginx+uwsgi+flask搭建后怎么访问.py文件
一、介绍
最近开发要用一个测试环境,是这样的Nginx+uwsgi+flask 的一个结构。下面是一些记录,在Centos 系统上使用Flask 架构部署一个简单的Python应用。然后使用Nginx作为前端反向代理,设置uWSGI应用网关处理web应用程序。
二、条件
1) 环境要求
Server OS:最小化安装 Centos 68
Nginx :反向代理
Python26~27:开发语言
Flask/uWSGI:框架
Pip:python包管理工具
iptables&selinux:开放用到的端口,关闭selinux。
2) 安装必备的开发工具以及环境
更新系统:
[root@hcloud ~]# yum update -y[root@hcloud ~]# yum groupinstall "Development tools" -y
更新完成后,记得重启系统,然后安装工具:
[root@hcloud ~]# yum install wget vim telnet python-devel zlib-devel openssl-devel bzip-devel -y[root@hcloud ~]# yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel python-devel libxml2 libxml2-devel python-setuptools zlib-devel wget openssl-devel pcre pcre-devel sudo gcc make autoconf automake -y
3) 安装python 包管理工具-pip
[root@hcloud ~]# wget strappypaio/get-pippy && python get-pippy或者参考此网站
4) 安装uWSGI与Flask
下载软件
[root@hcloud ~]# mkdir soft[root@hcloud ~]# cd soft
[root@hcloud soft]# wget ackages/0c/1c/44849e293e367a157f1ad863cee02b4b865840543254d8fae3ecdebdbdb9/uwsgi-2012targz[root@hcloud soft]# wget rg/packages/db/9c/149ba60c47d107f85fe52564133348458f093dd5e6b57a5b60ab9ac517bb/Flask-0101targz
如果下载该软件比较慢,可以在/etc/reslovconf dns中添加一个8888 ,很快的哦。
安装软件(开发要求固定版本,如果不介意版本的话,可以直接使用pip install packge 即可安装,相当于linux中的yum)
[root@hcloud soft]# tar -xf Flask-0101targz[root@hcloud ~]# cd Flask-0101[root@hcloud Flask-0101]# python setuppy install[root@hcloud soft]# tar -xf uwsgi-2012targz
[root@hcloud soft]# cd uwsgi-2012[root@hcloud uwsgi-2012]# python setuppy install
5) 创建一个测试应用
创建一个Web应用程序存放的文件夹
[root@hcloud ~]# mkdir -pv /usr/local/webtest[root@hcloud ~]# cd /usr/local/webtest
创建一个python 脚本,内容如下:
[root@hcloud webtest]# cat myprojectpyfrom flask import Flask
application = Flask(__name__)
@applicationroute("/")
def hello():
return "<h1 style='color:blue'>Hello Flask!</h1>"if __name__ == "__main__":
applicationrun(host='0000')
创建WSGI入口点文件,名字为:wsgipy,内容如下
[root@hcloud webtest]# cat wsgipyfrom myproject import applicationif __name__ == "__main__":
applicationrun()
6) 配置uWSGI服务器网关服务运行方式,运行端口等。
上述两个python脚本文件创建完成后,uwsgi命令启动,运行在8000端口上,指定协议http,运行时会出现一些警告,暂时可以忽略,是因为当前是root账户运行的uwsgi,后面从配置文件启动时会配置普通用户nginx即可。
[root@hcloud webtest]# uwsgi --socket 0000:8000 --protocol=http -w wsgi验证下,看下监听端口
[root@hcloud webtest]# netstat -aultnp | grep 8000tcp 0 0 0000:8000 0000: LISTEN 7181/uwsgi
tcp 0 0 1921683058:8000 1921683065:48164 TIME_WAIT -
可以打开浏览器访问测试一下:http://1921683058:8000
7) 创建uWSGI配置文件
以ini格式为uwsgi启动配置文件(还有xml,json,等多种格式),这样就不用在命令行输入一大堆命令了,用uwsgi命令启动,后面可以创建uwsgi启动脚本,加入到系统服务
在项目的目录中,创建uwsgiini:
[root@hcloud webtest]# cat uwsgiini[uwsgi]
uid = nginx
gid = nginx
socket = 127001:8000 master = truevhost = trueworkers = 8reload-mercy = 10vacuum = truemax-requests = 10000limit-as = 1024buffer-sizi = 3000pidfile = /var/run/uwsgipid
daemonize = /var/log/uwsgi/uwsgilog
chdir = /usr/local/webtest
module = wsgichmod-socket = 660enable-threads = true
保存并退出。配置文件参考
大致的解释下:
uid 、gid :以哪个用户、组启动服务
socket:监听的ip及端口
master: 启动主进程
workes:服务器启动的进程数
reload-mercy:平滑的重启
pidfile :启动时的pid 文件。
daemonize :启动日志
module :web应用的入口模块名称
enable-threads : 启用线程模式
8) 创建开机系统启动脚本文件,名字为uwsgid。
uwsgid
创建完成后,赋予执行权限,加入开机启动
[root@hcloud ~]# chmod +x /etc/initd/uwsgid[root@hcloud ~]# chkconfig --add uwsgid
[root@hcloud ~]# chkconfig --level 2345 uwsgid on
检查下
[root@hcloud ~]# chkconfig --list uwsgiduwsgid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
启动uwsgid
[root@hcloud ~]# service uwsgid startStarting uwsgi:
[uWSGI] getting INI configuration from /usr/local/webtest/uwsgiini
验证下监听端口(注:这里我们使用127001 作监听,是为了后期在使用时,对外只有nginx可以访问web应用):
[root@hcloud ~]# netstat -aultnp | grep :8000tcp 0 0 127001:8000 0000: LISTEN 8945/uwsgi9) 安装Nginx配置代理
先下载安装66的epel源
[root@hcloud ~]# wget ojectorg/pub/epel/6/x86_64/epel-release-6-8noarchrpm[root@hcloud ~]# rpm -ivh epel-release-6-8noarchrpm安装nginx
[root@hcloud ~]# yum install nginx -y安装完成后,修改nginx默认配置文件defaultconf,修改之前可以先备份下源文件噢。完整内容如下:
[root@hcloud ~]# cat /etc/nginx/confd/defaultconfserver {
listen 80;
server_name 1921683058;
location / {
include uwsgi_params;
uwsgi_pass 127001:8000;
uwsgi_param UWSGI_SCRIPT wsgi;
uwsgi_param UWSGI_CHDIR /usr/local/webtest;
index indexhtml indexhtm;
client_max_body_size 35m;
}
}
以上内容代理了uwsgi的端口,客户端通过访问nginx的80端口,然后nginx在将请求转发到后台flask应用的8000端口上。
启动nginx
[root@hcloud ~]# service nginx startStarting nginx: [ OK ]
在浏览器内测试访问一下nginx:http://1921683058
每个人都应是守望者,守望我们的心智,我们的理想,以防它在生活中不知不觉地坠落、被操控和被自己遗忘。。。
1、Django
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
2、Flask
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
Flask 很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。Flask 框架学会以后,可以考虑学习插件的使用。例如使用 WTForm + Flask-WTForm 来验证表单数据,用 SQLAlchemy + Flask-SQLAlchemy 来对你的数据库进行控制。
3、Tornado
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
关于干货分享!Python三大web框架简单介绍,环球青藤小编就和大家分享到这里了,学习是永无止境的,学习一项技能更是受益终身,所以,只要肯努力学,什么时候开始都不晚。如果您还想继续了解关于python编程的学习方法及素材等内容,可以点击本站其他文章学习。
1建立: F:\Python\flask文件夹路径
2安装virtualenv,在此路径下打开命令行窗口输入:
3新建一个目录,并在里边创建virtualenv环境,在DOS下
如图:
这时你创建的myproject文件夹里面就多了一个venv文件夹:
4激活虚拟环境
现在命令行前面多了个(venv)表示你在venv环境内
5在virtualenv里安装Flask
完成。如图:
6验证是否安装,你可以进入 Python 解释器,尝试导入 Flask:
如果没有报错,那么就安装成功了~如图:
1在myproject文件夹下打开命令行:
cd app #进入app文件夹
mkdir static
mkdir templates
我们的应用程序包是放置于 app 文件夹中。子文件夹 static 是我们存放静态文件像,JS文件以及样式文件。子文件夹 templates 显然是存放模板文件。
2为我们的 app 包(文件 app/ init py )创建一个简单的初始化脚本:
上面的脚本简单地创建应用对象,接着导入视图模块,该模块我们暂未编写。
视图是响应来自网页浏览器的请求的处理器。在 Flask 中,视图是编写成 Python 函数。每一个视图函数是映射到一个或多个请求的 URL。
3让我们编写第一个视图函数(文件 app/viewspy ):
其实这个视图是非常简单,它只是返回一个字符串,在客户端的网页浏览器上显示。两个 route 装饰器创建了从网址 / 以及 /index 到这个函数的映射。
4能够完整工作的 Web 应用程序的最后一步是创建一个脚本,启动我们的应用程序的开发 Web 服务器。让我们称这个脚本为 runpy,并把它置于根目录:
这个脚本简单地从我们的 app 包中导入 app 变量并且调用它的 run 方法来启动服务器。请记住 app 变量中含有我们在之前创建的 Flask 实例。
5要启动应用程序,您只需运行此脚本(runpy)
如图:
6在服务器初始化后,它将会监听 5000 端口等待着连接。现在打开你的网页浏览器输入如下 URL:
另外你也可以使用这个 URL:
你看清楚了路由映射是如何工作的吗?第一个 URL 映射到 /,而第二个 URL 映射到 /index。这两个路由都关联到我们的视图函数,因此它们的作用是一样的。如果你输入其它的网址,你将会获得一个错误,因为只有这两个 URL 映射到视图函数。
你可以通过 Ctrl-C 来终止服务器
入门就到这里,比较简单的。
下一章:
python轻量框架--Flask(模板详细版)
在使用 Gunicorn + flask 搭建的一个 web 项目中,由于使用了机器学习模型,在第一次请求接口的时候需要加载模型,在本地运行的时候加载模型很快所以正常运行,将应用使用 docker 的方式部署到服务器上面(模型是通过 volume 的方式挂载到容器中的), 第一次请求加载模型耗时比较长,报出如下错误:
从报错信息可以看出,gunicorn 的 worker 进程超时导致进程退出重启。
查阅 gunicorn 官方文档,有下图所示的描述:
timeout
命令行 : -t INT 或 --timeout INT
默认 : 30
默认超过这么多秒的 worker 进程将被杀死并重新启动。
值为正数或 0。将其设置为 0 会通过完全禁用所有 worker 的超时来实现无限超时。
通常,默认值 30 秒就足够了。如果您确定对同步 worker 的影响,则仅将此设置更高。对于非同步 worker,这仅意味着工作进程仍在通信,并且与处理单个请求所需的时间长度无关。
从官网的文档说明我们可以知道,gunicorn 默认的超时时间为 30s ,如果超过 30s,则 worker 进程将被杀死并重新启动。
所以解决这个问题只需要设置较大的超时时间即可:
参考文档:
gunicorn 官方文档
书接上文 flask与SQLAlchemy ,我们了解到
这一步的的测试可以看 一个小型的资源管理站
这里与直接上结果。
原flask使用的WSGI是python,但是很明显python作为HTTP解释器是效率低下的。而且,直接运行flask也是非常糟心的。比如集中配置,比如多进程多线程,比如socket通信,比如log管理,比如进程管理
将此文件放置在项目的根目录,并创建文件夹uwsgi
详见 https://wwwjianshucom/p/4c0fb2ed6083
flask+uWSGI已经能实现webserver的功能了,但是更加优秀的weberver还需要nginx的辅助。
Nginx(发音同engine x)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。
还有写拓展处理 主要看服务配置
这里 nginx -s reload 已经完成了服务配置。如果不想配置服务,直接到nginx根目录运行 /sbin/nginx
这里给大家推荐一个不错的平台:Cloudflare
Cloudflare
在使用之前我们需要更换自己的顶级域名代理商,这一步此处以腾讯云截图:
跳过注册等过程,我们直接进入域名管理界面,看到
然后创建密钥
xxxpem
xxxkey
再扔到服务器上去。
最后再配置nginx
总结配置flask一般形态的生产环境nginx+uwsgi+flask
回到目录
REST(Representational State Transfer)是一种架构风格,表述了网络中客户端于服务端的一种交互,REST本身是不实用的,关键的是如何设计它。REST架构就是为了HTTP协议设计的。RESTful web services的核心概念是管理资源。资源是由URIs来表示,客户端使用HTTP当中的'POST,GET, PUT, DELETE'等方法发送请求到服务器,改变相应的资源状态。
Flask是一个基于Python开发的微型web框架,其中Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户。
一个简单的例子:
这里又两种方法构造服务,第一中就是利用flask的路由进行构造,另外一种就是利用flask 的扩展插件来构造。首先我们假定一种业务场景:
做一个最简单的图书馆里系统,实现如下功能
了解过HTTP的都了解这该如何做,那么使用flask 会怎么构造服务呢?又两种办法 1 利用路由写。2利用flask的扩展插件写 接卸来就开始介绍这两种方法如何实现吧!
在实现之前可以使用postman 对接口进行测试
未完待续
首先纠正几个名词问题
服务器是指的硬件,PYthon作为一个编程语言是无法制作硬件的
网址更确切的说应该是域名服务,网址是一个指向地址,指向的是服务器的IP地址
python只能制作网站后台程序,目前已经有现成的py库可以快速搭建网站服务如:Django,Flask,Bottle 等框架都可以实现
通过网址访问,则需要域名服务,需要从域名服务商购买域名,并将域名解析到,网站服务器上,通过80端口访问通过网站程序搭建的网站
网址从服务商处注册,是需要一定费用的,可以根据自己的需要在服务商处选择
域名是可以自己自定义选择的,不过一定得是别人没有注册过的才行
服务器也是需要付费的
1、首先了解什么是 restful 架构?
rest :representational state transfer表现层状态转化
资源 :网络上的一个实体,或者说一个具体的信息。每种资源对应一个特定的URI,要获取这个资源,就是访问这个URI就可以
表现层 :representation 把资源呈现出来的形式,叫做表现层,在HTTP请求的头信息中用Accept和Content-Type字段指定,是对“表现层”的描述
状态转化 :客户端想要操作服务器,必须通过某种手段,让服务器发生状态转化,有 GET 、 POST 、 PUT 、 DELETE 四种方式,其中 GET 是用来获取资源, POST 是用来新建资源(也可以进行更新资源), PUT 用来更新资源, DELETE 用来删除资源
所以restful架构是:
1)每一个URI代表一个资源;
2)客户端和服务器之间,传递这种资源的某种表现层;
3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现“表现层状态转化”;
误区:最常见的一种设计错误,就是URI中包含动词。因为“资源”表示一种实体,所以应该是名词,URI不应该有动词,动词应该放到HTTP协议中
2、Flask-RESTful基本请求
其中一个接口有两种请求方式,一个是get,另一个是post。
get返回USER_LIST这个json数据;
post需要传一个参数,然后返回整个USER_LIST,请求一次post方法就会多添加一次数据,如果post请求中找不到name字段,则返回“400 Bad Request”错误;
由于类UserList没有定义put()和delete()函数,所以在”PUT”或”DELETE”请求时会返回”405 Method Not Allowed”错误。
其中在postman中是这么进行传递的
GET请求
POST请求
另外,路由支持多个路径,比如:
访问userlist和users两个路径的效果完全一样
3、带参数的请求
上面的例子中我们都是针对USER_LIST这个列表的,如果我们需要针对具体的user进行操作呢,就需要传递具体的user_id了,这时候,我们就需要路由支持带参数。
在User类的get(),post(),put()等成员函数中,记得加上参数user_id来获取传入的变量值
4、参数解析
在“POST”和“PUT”请求中,直接访问form表单并验证的工作有些麻烦,Flask-RESTful提供了 reqparse库来简化,可以通过 parseradd_argument() 方法来定义form表单字段,并指定其类型,然后在put或者post函数中调用 parserparse_args() 来获取表单内容,并返回一个字典,该字典就包含表单的内容。 parserparse_args() 方法会自动验证数据类型,返回400错误,还可以添加strict参数,如 parserparse_args(strict=True) ,此时出现为定义的参数,也会返回400错误
0条评论