遇到涉及金字塔请求网址的问题,其中request.static_url
和request.application_url
是2个可识别的嫌疑人。
Pyramid中生成的请求网址在某种程度上包含了我放置时的视图网址
在Web主机上,但使用pserve
在本地工作正常。
例如:
config.add_route('signin','/view/signin')
在Mako模板中
我有:
href="${request.static_url('project:static/blueprint/css/screen.css')}"
应显示(使用pserve
):
href="http://www.site.com/static/blueprint/css/screen.css"
但它显示:
href="http://www.site.com/view/signin/static/blueprint/css/screen.css"
另一个例子是首页网址应该显示:
src = "http://www.site.com/static/img/foo.jpg"
而是显示:
src = "http://www.site.com//static/img/foo.jpg"
我目前在VPS服务器上使用nginx 0.8.53 + Phusion passenger 2.2.15运行Pyramid 1.3 + Mako模板。
这与request.application_url
相同。在视图代码中,我发送了一个dict(url = request.application_url + '/view/signin'
)
表格的网址应显示:
action="http://www.site.com/view/signin"
相反它显示:
action="http://www.site.com/view/signin/view/signin"
我在http://wiki.pylonshq.com/display/pylonscookbook/Running+Pylons+with+NGINX上复制了一些nginx设置。
特别是:
#site runs on Pylons
location / {
include /usr/local/nginx/conf/proxy.conf;
proxy_pass http://127.0.0.1:8080;
proxy_redirect default;
}
和proxy.conf:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
我独自留下的其他人是我不想碰的东西。
服务器上的nginx.conf看起来像这样。 (我不使用PHP,但那是我不想触摸的东西)。
有人建议将应用程序提供/安装在/,但我不知道该怎么做。
server {
listen <ip>:80;
server_name site.com www.site.com;
access_log /<path>/access.log combined;
error_log /<path>/error.log error;
root /home/<path>/public;
index index.html index.htm index.php index.php5;
include /home/<path>/nginx/site.com/*;
# No mirrors - using strict redirects
#if ($http_host != site.com) {
rewrite ^(.*)$ http://site.com$1 permanent;
#}
autoindex on;
passenger_enabled on;
passenger_base_uri /;
# Disallow access to config / VCS data
location ~* /\.(ht|svn) {
deny all;
}
#site runs on Pylons
location / {
include /<path to conf file>/proxy.conf;
proxy_pass http://127.0.0.1:8080;
proxy_redirect default;
}
# Statistics
location /stats/ {
alias /home/<path>/html/;
auth_basic "Statistics Area";
auth_basic_user_file /home/<path>/html/.htpasswd;
}
location /doc/analog/ {
alias /usr/share/analog/;
}
# PHPMyAdmin
rewrite ^/dh_phpmyadmin/([^/]*)/(.*)$ /dh_phpmyadmin/$2;
location /dh_phpmyadmin/ {
alias /dh/web/phpmyadmin/;
}
location ~ /dh_phpmyadmin/(.+)\.php {
alias /dh/web/phpmyadmin/;
fastcgi_param SERVER_PORT 80;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include /dh/nginx/etc/fastcgi_params;
set $relpath "index.php";
if ($uri ~ ^/dh_phpmyadmin/(.+)$) {
set $relpath $1;
}
fastcgi_param SCRIPT_FILENAME /dh/web/phpmyadmin/$relpath;
fastcgi_pass unix:/home/<path>/.php.sock;
}
# PHP
location ~* \.(php|php5|php4)($|/) {
fastcgi_param SERVER_PORT 80;
fastcgi_split_path_info ^(.+\.(?:php|php5|php4))(/.*)$;
if (!-e $document_root$fastcgi_script_name) {
return 404;
}
include /dh/nginx/etc/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/home/<path>/.php.sock;
#pragma php_launch <path>
}
}
答案 0 :(得分:1)
好像你的网络服务器(乘客?我还没有使用过它)没有正确设置环境(request.environ
)。这可能是一个配置选项,但如果您在访问SCRIPT_NAME
时查看环境的PATH_INFO
和/view/signin
密钥,则会看到SCRIPT_NAME=''
和PATH_INFO='/view/signin'
。如果不是这种情况,则乘客的申请前缀可能有误。
答案 1 :(得分:0)
您的网站没有使用乘客服务金字塔。它确实使用了reverse_proxy。除非有办法在8080端口上运行乘客,否则你的nginx配置中的乘客部分是无用的。
那就是说,你可以看看那里:
http://kbeezie.com/view/using-python-nginx-passenger/5/
您必须删除此块以使其与乘客一起使用:
location / {
include /<path to conf file>/proxy.conf;
proxy_pass http://127.0.0.1:8080;
proxy_redirect default;
}
然后你必须创建你的可调用wsgi函数,它将调用金字塔。
您必须为乘客定义根路径:
root /path/to/app/public/;
并输入/path/to/app/
一个名为passenger_wsgi.py的文件,其内容与此文件类似
import sys
import os
def application(environ, start_response):
start_response("200 OK", [])
ret = ["%s: %s\n" % (key, value)
for key, value in environ.iteritems()]
return ret
但不是那样你必须调用金字塔,它是你的应用程序的入口点。
那就是说,你有没有理由使用乘客。使用像uwsgi这样的东西来部署你的应用程序会不会更容易。与乘客一起部署红宝石应用程序是有意义的,但我不知道你使用乘客获得了什么。
这是一个很好的教程,你可以跳过大部分的部分,因为这里只有nginx-uwsgi部分对你有意义。