windows系统通过apache和mod_wsgi部署Python 2.7+web.py踩坑记录

最近使用Python 2.7开发了一个基于web.py框架的小项目,最后在部署环节遇到很多坑,经过一番折腾,终于战胜了黑暗,迎接到了光明。如果您是打算在linux环境部署web.py框架,那就不用往下看了,因为网上有一大把的指导说明。

为什么要用Python2.7?因为web.py的最新版本是0.39,只支持Python2.x。如果要支持Python3,需要使用web.py的开发版0.40-dev1,我试验了一下,会报不少错误,根据网上的教程,修改了几处源码后,改不下去了,放弃Python3.x。

第一坑 安装正确的Apache版本

我的系统环境是windows 7 64位,Python版本是2.7.15 64位。Python的安装目录是C:\Python27。首先查看Python版本和VC版本关系。在命令提示符下输入:

Python

就可以看见对应的是v.1500。该版本对应的是Visual C++ 2008 (9.0) 。在apache的网站上,常见的是Apache 2.4 VC14和 Apache 2.4 VC15两个版本。我开始下载的就是VC14版本,后来死活配置不好。在网上搜索Apache 2.4 VC9版本,我下载的64位,解压到D盘。此时,httpd.exe程序应该在D:\Apache24\bin目录中。直接运行httpd.exe启动web服务。输入地址访问: http://localhost/

started_apache.png

这样,apache就运行成功了。如果访问不了,请打开D:\Apache24\logs\error.log文件查看错误原因,有可能是80端口被占用了。

第二坑 安装正确的mod_wsgi版本

下载编译好的 mod_wsgi模块

https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi

下载mod_wsgi.png

因为我们的Python 2.7和Apache 2.4都是基于VC9编译的,所以这里要选择VC9版本的mod wsgi下载。

把下载的.whl文件复制到C:\Python2.7\Scripts下,使用pip进行安装

pip install "mod_wsgi-4.6.5+ap24vc9-cp27-cp27m-win_amd64.whl" 

安装成功后在C:\Python2.7\Scripts文件夹下会新增mod_wsgi-express.exe文件。运行它进行配置

mod_wsgi-express module-config

输出下面的内容:

C:\Python27\Scripts>mod_wsgi-express.exe module-config
LoadModule wsgi_module "c:/python27/lib/site-packages/mod_wsgi/server/mod_wsgiNo
ne"
WSGIPythonHome "c:/python27"

这里就是mod wsgi的配置信息,不过有错误,因为生成的文件名字是mod_wsgi.pyd,并不是mod_wsgiNo
ne。将上面的内容复制并修改成:

LoadModule wsgi_module "c:/python27/lib/site-packages/mod_wsgi/server/mod_wsgi.pyd"
WSGIPythonHome "c:/python27"

打开Apache的配置文件D:\Apache24\conf\httpd.conf,增加下面的内容:

LoadModule wsgi_module "c:/python27/lib/site-packages/mod_wsgi/server/mod_wsgi.pyd"
WSGIPythonHome "c:/python27"

保存后,重启Apache的服务程序httpd.exe,只要不报错,说明mod wsgi已经配置成功了。

第三坑 配置虚拟服务器及web.py项目设置

1、创建基于web.py框架的项目

首先创建一个基于web.py框架的简单web项目。本文的项目是在D:\pyweb\目录中,文件结构如下:

D:\pyweb
│ wsgi_app.py

├─config
│ │ settings.py
│ │ url.py
│ │ init.py
│ │
│ └─sessions
├─controllers
│ welcome.py
init.py

├─sessions
├─static
│ ├─images
│ │ furley_bg.png
│ │
│ ├─js
│ ├─lib
│ └─stylesheets
│ theme.css

└─templates
error.html
index.html
layout.html

pyweb项目结构.png

其中,项目的启动文件是wsgi_app.py,config是配置目录,controller是控制器目录,sessions是session存储目录,static是css和js的目录,templates是html页面目录。

wsgi_app.py内容:

-*- coding:utf-8 -*-
import sys,os

#app's path
current_file_path=os.path.realpath(__file__)
parent_path = os.path.dirname(current_file_path)
sys.path.insert(0,parent_path)

from config.settings import app
import web

#application = app.wsgifunc()
application = app.run()

config\setting.py内容:

!/usr/bin/env python

# coding: utf-8

import os,sys
import web
from url import urls

web.config.debug = True

config = web.storage(
    site_name = 'hello webpy',
    site_desc = '',
    static = '/static',
)

app = web.application(urls, globals())

#wsgi要求绝对路径
current_file_path = os.path.dirname(__file__)
abspath = os.path.dirname(current_file_path)

print "abspath:%s"%abspath
sys.path.append(abspath)
os.chdir(abspath)

session = web.session.Session(app, web.session.DiskStore('sessions'),initializer={'login_user_id':0,})  
render = web.template.render('templates/',base='layout', cache=False)

web.template.Template.globals['config'] = config
web.template.Template.globals['context'] = session
web.template.Template.globals['render'] = render

config\url.py内容:

#!/usr/bin/env python
# coding: utf-8

pre_fix = 'controllers.'
urls = (
    "/",        pre_fix + 'welcome.Index',
    )

controllers\welcome.py内容:

#!/usr/bin/env python
# coding: utf-8

import web
from config import settings
render = settings.render

class Index:
    def GET(self):
        i = web.input(name=None)
        if i:
            name=i.name
        else:
            name=''
        return render.index(name=name)

templates\layout.html内容:

$def with (content)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">

    <link rel="stylesheet" type="text/css" href="$config.static/stylesheets/theme.css">

</head>
<body>
    <div class="container">
        $:content
    </div>
</body>
</html>

templates\index.html内容:

$def with (name)
$if name:
    <h3>I just wanted to say <em>您好</em> to $name.</h3>
$else:
    <h3><em>您好</em>, world!</h3>

static\stylesheets\theme.css内容:

body {
  background: #eee;
  background-image: url(../images/furley_bg.png);
  background-position: initial initial;
  background-repeat: initial initial;
  margin: 0px;
}

启动web项目,打开命令行窗口,切换到D:\pyweb,输入命令:

D:\pyweb>c:\Python27\python wsgi_app.py
abspath:D:\pyweb
http://0.0.0.0:8080/

打开浏览器,访问http://0.0.0.0:8080/

第一次启动web.png

访问http://0.0.0.0:8080/?name=zhangsan

hello张三.png

2、配置Apache虚拟服务器

首先修改wsgi_app.py 文件,设置启动方式为:app.wsgifunc()

# -*- coding:utf-8 -*-
import sys,os

#app's path
current_file_path=os.path.realpath(__file__)
parent_path = os.path.dirname(current_file_path)
sys.path.insert(0,parent_path)
#print sys.path

from config.settings import app
import web

application = app.wsgifunc()
#application = app.run()

打开Apache的配置文件D:\Apache24\conf\httpd.conf,增加下面的内容:

AddType text/html .py
<VirtualHost *> 
    ServerName example.com 
    WSGIScriptAlias /demo d:/pyweb/wsgi_app.py/ 
    Alias /demo/static d:/pyweb/static/
</VirtualHost>
<Directory "d:/pyweb/static">
    allow from all
    AllowOverride None
    Options -ExecCGI
    SetHandler None
    AddType text/css .css
    AddType application/javascript .js
    AddType image/jpeg .jpg
    AddType image/png .png
</Directory> 

保存后,重启Apache的服务程序httpd.exe,打开浏览器访问http://localhost/demo/?name=zhangsan

hello张三.png

大功告成!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容