怎么说呢,比如php里会这样实现MVC
<?php
$controller = $_GET['controller'];
$controller_file = __DIR__."/controller/{$controller}.php";
if (!is_file($controller_file)) exit('404');
require_once $controller_file;
$control = new $controller;
$control->dispatch($_GET['action']);
像Python看到很多web源码都是一次性加载完所有的py脚本文件。像如下方式是不是不被推荐的?
import web
exec "import %s" % web.get('controller')
dir("controller_%s" % web.get("controller"))
1
lqs 2015-03-09 12:29:05 +08:00
大多数 Python Web 框架的机制都是只需在应用启动时 import 一次即可,只有一次性开销,而不是像 PHP 那样每个请求来都要 include 一遍。
|
2
cevincheung OP |
3
lqs 2015-03-09 12:46:00 +08:00
@cevincheung Python 如果作为 CGI 方式来运行也是一样,但现在通常使用 WSGI 方式:应用程序启动时加载好所有需要的库,每个请求过来只是调用函数来处理这个请求。
|
4
9hills 2015-03-09 12:51:46 +08:00 via iPhone
现在php都是fastcgi了吧,每次都唤起太浪费资源。
|
5
typcn 2015-03-09 12:58:31 +08:00
在持久运行的程序里每个请求都 import 一下,就类似于每次启动同一个软件都去重新下载一下
|
6
anewg 2015-03-09 13:04:24 +08:00
@cevincheung 使用opcache可以避免
|
8
cevincheung OP @lqs 那如果一个请求执行的过程中根本用不到某个库,也加载进来那不是得不偿失了?如果刚好是一个大库
比如加载进来就一定会执行某些耗时或耗费CPU操作的,比如Redis。一加载就必须连接redis的(打个比方)。 |
10
lqs 2015-03-09 13:39:23 +08:00
@cevincheung 这也总比在处理请求的时候再去干这些耗费CPU的操作要好。
|
11
est 2015-03-09 13:39:50 +08:00
@cevincheung 用exec的确不推荐。直接 __import__("blah.blah")
|
12
cute 2015-03-09 13:44:28 +08:00
用__import__吧
|
13
JoeShu 2015-03-09 14:00:37 +08:00
不被推荐的不是动态导入,而是exec的使用。python的动态加载module最好使用__import__,或者imp和importlib模块
|
14
nine 2015-03-09 15:24:19 +08:00 1
|
15
RIcter 2015-03-09 16:02:58 +08:00
import web
exec "import %s" % web.get('controller') -> controller = "; import os; os.system('rm -rf ../')" GG |
16
cevincheung OP @RIcter - -#只是打个比方而已- -
|