本文部署环境为windows10(64bit)
web环境为Wamp3.0.6 64bit(Apache2.4.23 + mysql5.7.14) + mod_wsgi4.5.17+ flask0.12.2 + python3.6
根据自己喜好选择自己的web包管理(因为自身流淌着php的血液,windows环境喜欢Apache,mysql,php都封装好的包管理服务,如果是Linux环境会选择Nginx替代Apache),一般都选择wamp或者xmapp,但注意需要确定版本,比如装64位之后的软件都统一为64位软件包。
wamp下载地址:http://www.wampserver.com/en/(本文用wamp配置)
xmapp下载地址:https://www.apachefriends.org/zh_cn/index.html
本文是安装Apache2.4.23,运行wamp服务端
启动所有服务(Apache,mysql)
绿色为开启成功,黄色则部分成功,需检查错误,一般为80端口被占用。
再运行localhost检查看是否报错(一般报错会出现在网页下方红字信息)
(因为第四节翻写了项目vhost接口,把Apache接口服务给屏蔽了,可以跳过此步骤内容)下面配置Apache让其他电脑访问自己的主机
Apache设置中httpd.conf文件下进行配置,一般所在文件位置D:\wamp64\bin\apache\apache2.4.23\conf\httpd.conf,或者wamp服务器左键选择如下:
接着找到Require local,将Require local修改为Require allgranted,AllowOverride None修改为AllowOverride All这样操作当然安全系数会调低。保存并重启Apache即可。(2.2版本Apache是Deny from all改成Allow from all)。最后记得关闭防火墙就可访问了!
上文已安装好Wamp,也就安装好了Mysql,还需要装MySQL-python驱动
下载地址:https://pypi.python.org/pypi/MySQL-python/
查阅MySQL-python-1.2.5.zip 发现只支持py2.7,好吧查阅其他资料
由于MySQLdb模块还不支持Python3.x,所以Python3.x如果想连接MySQL需要安装pymysql模块。PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2中则使用mysqldb。所以需要pip install PyMySQL。但如果你使用的是pycharm IDE,则可以使用project python安装第三方模块。
由于Python统一了数据库连接的接口,所以 pymysql 和 MySQLdb 在使用方式上是类似的。写个python代码测试下数据库,自行建表调用。
# -*-coding: utf-8 -*-
import pymysql.cursors
# 连接数据库
connect =pymysql.Connect(
host='localhost',
port= 3306,
user='root',
passwd='',
db='zhitong_ikeeko_ai',
charset='utf8'
)
# 获取游标
cursor =connect.cursor()
# 查询数据
sql = "SELECT *FROM lesson_work WHERE lesson_item_id = '%s' "
data = ('100')
cursor.execute(sql % data)
for rowincursor.fetchall():
print(row)
print('共查找出',cursor.rowcount,'条数据')
# 关闭连接
cursor.close()
connect.close()
运行结果正常。
根据项目需求选择自己的python web开发端框架,一般接口端用flask框架,企业级页面用django(web2py还没支持python3.6)安装。(其实Anaconda都安装好了flask)安装直接pip install flask即可,安装成功后在python命令下看import flask看是否报错。
通过Flask,创建神奇的Hello World程序:
1. 项目文件目录如下:
2. _init_.py创建Flask实例:
# -*-coding: utf-8 -*-
from flaskimportFlask
#创建项目对象
app =Flask(__name__)
import views
3. run.py创建启动脚本:
# -*-coding: utf-8 -*-
from __init__importapp
app.run(debug =True)
#app.run(host=0.0.0.0,debug= True) #调试页面若要其他机子访问需设置host
4.views.py,加入下面代码
# -*-coding: utf-8 -*-
from __init__importapp
@app.route('/',methods=['GET','POST'])
def index():
return "Hello World!"
运行代码后,可在对应网页输入网址查看,一般没指定端口的话localhost:5000可看到页面显示 Hello World!。但是这个服务器还不能满足需求。需要开发稳定架构web端服务器,比如接口程序供其他人员调用。
Web服务器架构如下:
本文配置为Apache2.4.23 + mod_wsgi4.5.17+ flask0.12.2 + python3.6 ,起初本想选择更好的uwsgi协议,无奈Gunicorn,uwgsi都不支持windows,那就乖乖用mod_wgsi
mod_wsgi可在http://www.lfd.uci.edu/~gohlke/pythonlibs/依赖库找到
首先在Apache下配置mod_wsgi,需要使Apache httpd服务器加载wsgi_module扩展。将下载的mod_wsgi.whl修改后缀名为zip并解压,把mod_wsgi.so置于Apache server安装目录的modules文件下,在httpd.conf文件中添加如下一行:LoadModule wsgi_module modules/mod_wsgi.so。
假若解压后找不到mod_wsgi.so,(我用的最新版是找不到的)OK往下看:
1.先用pip该whl安装
2.运行Anaconda prompt 输入 mod_wsgi-express module-config命令
3.复制那三行到wamp服务端的httpd.conf文件下进行修改(一般所在文件位置D:\wamp64\bin\apache\apache2.4.23\conf\httpd.conf,或者wamp服务器托管图标左键Apache选择httpd.conf如下)
添加如下内容:
LoadFile"d:/anaconda3/python36.dll"
LoadModule wsgi_module"d:/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "d:/anaconda3"
#指定website的app.wsgi配置文件路径,这里可以不用设置,相当于#localhost会指向自己的网页,而不指向wamp服务器。
#具体网页配置在下面,第一个参数为网页路由路径,第二个参数为具体的项目所在。
#这里先以app.wsgi为解析入口
#WSGIScriptAlias / C:/Users/Administrator/Desktop/ai.ikeeko/app.wsgi
#指定项目路径
WSGIPythonPath C:/Users/Administrator/Desktop/ai.ikeeko
Require all granted
4.既然定义解析入口app.wsgi,现在创建编写解析入口,在所在项目新建py文件,写下以下脚本代码:
#-*- coding: utf-8 -*-
import sys
sys.path.insert(0, 'c:/Users/Administrator/Desktop/ai.ikeeko/') #工程根目录,即wsgi文件的路径
from __init__ import app as application #这里的__init__就是指向__init__.py
保存文件后,修改后缀名为app.wsgi
5.修改httpd-vhosts相关信息
开启Apache虚拟主机服务httpd.conf文件下
# Virtual hosts
# Include conf/extra/httpd-vhosts.conf
将上面的#去掉就可以引入虚拟主机的配置文件了(一般Wamp是开启的)。
在C:\wamp64\bin\apache\apache2.4.23\conf\extra\httpd-vhosts.conf或者wamp服务器左键中Apache可选httpd-vhosts.conf修改如下:(为了让外部机子都可访问该网页,我把自带的wamp的vhost内容给屏蔽。添加新的域名接口,并规定Require all granted同时定义了Errorlog的相关信息,如果报错可查看项目中该文件)
# Virtual Hosts
#
#
# ServerName localhost
# DocumentRoot D:/wamp64/www
#
# Options +Indexes+Includes +FollowSymLinks +MultiViews
# AllowOverride All
# Require local
#
#
ServerName ai.ikeeko.local
DocumentRootC:/Users/Administrator/Desktop/ai.ikeeko
ErrorLog"C:/Users/Administrator/Desktop/ai.ikeeko/error.log"
WSGIScriptAlias /C:/Users/Administrator/Desktop/ai.ikeeko/app.wsgi
Options -Indexes +FollowSymLinks
Require all granted
AllowOverride All
WSGIScriptReloading On
#
6.修改windows的host相关信息,输入项目域名会重定向到本地指定路由:
在C:\Windows\System32\drivers\etc\hosts补上如下
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 ai.ikeeko.local
::1 ai.ikeeko.local
7.测试网页
把上面编写的flask网页test.py放在项目工程里,打开浏览器运行项目域名:
传统使用Python的web框架时,想把修改的程序立即呈现在浏览器上,只需在代码修改为app.run(debug=True)。进入调试模式会出现以下代码。
* Restarting with stat
* Debugger is active!
* Debugger PIN: 189-797-646
* Running on http://127.0.0.1:5000/(Press CTRL+C to quit)
(好吧,我用Spyder启动不了flask的调试模式,一直卡在*Restarting with stat,最后用了PyCharm运行,没出现这个问题)自此,每次更新代码,flask都会reload,然后反馈到浏览器上。
当然,在用Python的web框架(DJango或Flask)部署在Apache上。当项目代码有更新时,我们希望Apache能够自动地reload代码。将Python web项目部署在Apache上需要借助mod_wsgi。mod_wsgi具有两种工作模式,分别是Embedded process和Daemon process。前者的wsgi程序是Apache进程直接管理和调用的,因此当项目代码更改时,必须restart或者reload Apache才能达到代码更新的目的。而后者Apache为wsgi程序启动了一个守护进程,类似于FastCGI的后台,mod_wsgi会借Apache的外壳,另外启动一个或多个进程,然后通过socket通信和Apache的进程联系,即独立于Apache进程的进程。其效果是,当web项目中的wsgi脚本有变化时,该守护进程就会被重启。该重启过程中,自然项目代码也就被reload进入内存了。
Windows环境:WSGIDaemonProcess 在Windows 中不会被执行, 使用上面的配置 Apache 会拒绝运行,估计等以后版本解决吧。
所以windows调试方法只能用传统方法,用PyCharm先跑基本py文件测试完,再统一重启Apache更新。
嗯简单测试,随便修改’Hello World’字段。
浏览器输入http://127.0.0.1:5000,可看到修改:
但Apache那边没修改,浏览器输入自己的虚拟域名,需要Apache重启:
有别于php的MVC框架开发,Python一般以MTV框架开发web,这边有大概web开发详细参考http://www.cnblogs.com/mysql-dba/p/6070258.html
controller目录:MVC中的C,主要存放视图函数
model目录:MVC中的M,主要存放实体类文件,映射数据库中表
templates:MVC中的V,存放html文件
static:静态文件,主要存放css,js等文件
__init__.py:模块初始化文件,Flask 程序对象的创建必须在 __init__.py 文件里完成, 然后我们就可以安全的导入引用每个包。
setting.py:配置文件,数据库用户名密码等等
具体Flask开发参考:http://blog.csdn.net/xdhstc/article/details/52217030
结合上面知识,把第二节获取到的数据库信息lesson_work以get方式回复接口:
参考文档:
1.《apache+mod_wsgi+flask 环境搭建》http://blog.csdn.net/yo746862873/article/details/52098658
2.《Flask + mod_wsgi + Apache on Windows 部署成功》http://blog.csdn.net/firefox1/article/details/46438769