2009-05-19 20 views
11

Thương hiệu mới cho thiết kế web, sử dụng python. Có Apache và chạy, kiểm tra kịch bản python làm việc trong thư mục cgi-bin. Nhận kết quả hợp lệ khi tôi nhập URL một cách rõ ràng: ".../cgi-bin/showenv.py"Làm cách nào để ẩn "cgi-bin", ".py", v.v ... khỏi các URL của tôi?

Nhưng tôi không muốn URL trông như vậy. Ở đây tại stackoverflow, ví dụ, các URL hiển thị trong thanh địa chỉ của tôi không bao giờ có các chi tiết lộn xộn hiển thị kịch bản đã được sử dụng để chạy chúng. Chúng sạch sẽ với các phần mở rộng cgi-bin, .py, etc. Làm thế nào để làm điều đó?

CHỈNH SỬA: Cảm ơn bạn đã trả lời, mỗi câu trả lời đều hữu ích, rất nhiều điều cần tìm hiểu. Tôi đang đi với URL Viết lại cho bây giờ; ví dụ trong các tài liệu trông rất gần với những gì tôi thực sự muốn làm. Nhưng tôi cam kết trăn trở, vì vậy sẽ phải nhìn WSGI xuống đường.

+1

..Tôi tự hỏi liệu câu hỏi này có phù hợp hơn với serverfault.com không? (kể từ khi nó thực sự về cấu hình apache) –

+0

Cập nhật 3 năm: phải mất rất ít thời gian (ngày) để xem giá trị của WSGI, và sau đó (tuần) giá trị của một khuôn khổ, từ đó nhập Django. Bắt đầu từ đầu, tôi đã phải học tất cả những điều khó khăn, nhưng nếu bạn đang đi du lịch một con đường tương tự, Django là nơi bạn sẽ kết thúc. –

Trả lời

13

Cách viết các ứng dụng web bằng python không phải là cgi-bin. Đó là bằng cách sử dụng WSGI.

WSGI là giao diện chuẩn giữa các máy chủ web và các ứng dụng web hoặc khung công tác Python. PEP 0333 xác định nó.

Không có bất lợi nào khi sử dụng nó thay vì CGI. Và bạn sẽ đạt được rất nhiều. URL đẹp chỉ là một trong những điều gọn gàng bạn có thể thực hiện dễ dàng.

Ngoài ra, việc viết một ứng dụng WSGI có nghĩa là bạn có thể triển khai trên bất kỳ máy chủ web nào hỗ trợ giao diện WSGI. Apache làm như vậy bằng cách sử dụng mod_wsgi.

Bạn có thể cấu hình nó trong apache như thế:

WSGIScriptAlias /myapp /usr/local/www/wsgi-scripts/myapp.py 

Sau đó tất cả các yêu cầu trên http://myserver.domain/myapp sẽ đi đến myapp.py của application callable, bao gồm http://myserver.domain/myapp/something/here.

dụ myapp.py:

def application(environ, start_response): 
    start_response('200 OK', [('Content-type', 'text/plain')]) 
    return ['Hello World!'] 
+1

+1 (nếu có thể). Nếu bạn muốn hiểu sự phát triển web Python "từ đầu," bạn vẫn nên bỏ qua CGI hoàn toàn. Việc viết ứng dụng WSGI của riêng bạn thực sự dễ dàng và một cách tốt để có được một xử lý về những gì mà khung công tác Python đang gói cho bạn. –

5

Tôi nghĩ bạn có thể làm điều này bằng cách viết lại URL thông qua cấu hình Apache. Bạn có thể xem tài liệu Apache để viết lại here.

4

Chỉ cần sử dụng một số khuôn khổ web tốt ví dụ django và bạn có thể có các URL như vậy nhiều hơn URL, bạn sẽ có cơ sở hạ tầng, mẫu, db hoặcm tốt hơn,

+0

Đó không phải lúc nào cũng là một ý tưởng hay. Nếu bạn đang làm một cái gì đó mà là tùy chỉnh thực sự bạn sẽ luôn luôn được hạn chế bởi các biên giới và các quy tắc của khuôn khổ mà bạn chọn. –

+0

có quyền, nhưng không chắc chắn nếu anh ta muốn phát triển khung web của riêng mình –

+3

Sử dụng khung làm việc - bạn sẽ hạnh phúc hơn nhiều so với việc phát triển khung của riêng bạn xung quanh cgi-bin. –

4

đây là trích đoạn .htaccess mà tôi sử dụng để đạt được điều như vậy, ví dụ này chuyển hướng tất cả yêu cầu mà không phải để index.php vào tập tin đó, tất nhiên bạn sau đó phải kiểm tra các biến máy chủ trong tập tin bạn chuyển hướng đến để xem, những gì đã được yêu cầu.

Hoặc bạn chỉ cần thực hiện quy tắc ghi lại, nơi bạn sử dụng RegExp như ^.*\/cgi-bin\/.*\.py$ để xác định thời điểm và nội dung cần ghi lại. RegExp như vậy phải được chế tác rất cẩn thận, do đó việc viết lại chỉ diễn ra khi muốn.

<IfModule mod_rewrite.c> 
    RewriteEngine On #activate rewriting 
    RewriteBase/ #url base for rewriting 
    RewriteCond %{REQUEST_FILENAME} !index.php #requested file is not index.php 
    RewriteCond %{REQUEST_FILENAME} !^.*\.gif$ #requested file is no .gif 
    RewriteCond %{REQUEST_FILENAME} !^.*\.jpg$ #requested file is no .jpg 
    RewriteCond %{REQUEST_FILENAME} !-d  #is not a directory 
    RewriteRule . /index.php [L]    #send it all to index.php 
</IfModule> 

Các Ví dụ trên sử dụng RewriteCond itions để xác định khi nào nên viết lại (của .gif, .jpeg của và index.php tự túc).

Hmm, do đó, đã có văn bản dài rồi. Hy vọng nó có một chút hữu ích, nhưng bạn sẽ không thể tránh được việc học cú pháp của Apache RewriteEngine.

3

Bạn sẽ tìm thấy chỉ ScriptAlias hữu ích. Sử dụng

ScriptAlias /urlpath /your/cgi-bin/script.py 

bạn có thể truy cập tập lệnh qua http://yourserver/urlpath.

Bạn cũng có thể muốn xem xét mod_passenger, mặc dù lần cuối cùng tôi sử dụng nó, WSGI là một "công dân hạng hai" trong thư viện - nó có thể phát hiện tập lệnh WSGI nếu nó được sử dụng để phục vụ toàn bộ miền nhưng nếu không thì không có chỉ thị nào để chạy ứng dụng WSGI.

+0

điều này không làm việc cho tôi – Harsha

+0

Hoạt động trên Apache 2.4 với 'mod_python'. Mát mẻ. – TranslucentCloud

Các vấn đề liên quan