2016-06-05 2 views
0

요청을 받고 응답을 보내는 간단한 웹 서버를 만들었습니다. 따라서 서버가 "localhost/not-a-page"와 같은 잘못된 요청을하면 서버는 웹 페이지에 이미지를 표시해야하는 HTML 파일 "404.html"의 내용을 포함하는 응답을 보냅니다. 여태까지는 그런대로 잘됐다.이미지가 파이썬 기반 웹 서버에로드되지 않습니다.

그러나 404 페이지가로드되면 페이지에서 이미지를 찾을 수 없습니다. HTML 부분이 정확하고 오프라인으로 작동합니다. 나는 이미지를 HTML에 비례하여 파이썬 스크립트에 상대적으로 serval 위치로 이동하려고 시도했다. 그러나 그것은 단지 그것을 발견 할 수 없다. 안녕하세요 저는 가능한 한 저수준으로 서버를 만들려고합니다. 서버 작동 방식을 배우고 싶습니다. 그래서 저는 서버 관련 라이브러리를 사용하지 않고 있습니다. 나는 파이썬의 소켓 라이브러리만을 사용하고있다.

나는 다른 라이브러리를 사용하지 않고이 문제를 해결하기 위해 어떤 도움을 주셔서 감사합니다

,

편집 여기 는 관련 파이썬 일부입니다

import socket 

import threading 

import os 



default_error_page = """\ 

<!DOCTYPE HTML> 

<html> 

<head> 

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 

<title>Error response</title> 

</head> 

<body> 

<center> 

<h1>Response</h1> 

<p>Error code: %(code)d</p> 

<p>Message: %(status)s.</p> 

</center> 

</body> 

</html> 

""" 


default_header_status = "HTTP/1.1 %(code)d %(status)s\r\n" 

default_header_content_type = "Content-Type: text/html; charset=utf-8\r\n\r\n" 

buffer_size = 1024 



def get_page(code): 

    page = default_error_page 

    if code == 200: 

        pass 

    else: 

        file = open(os.path.dirname(__file__) + "/www/not-found.html", 'r') 

        page = file.read() 

    return page 


class BaseServer: 


    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    server_name = "" 

    host_name = "" 

    host_port = 8000 # default port 

    is_shutdown = False 


    def __init__(self, name): 

        self.server_name = name 


    def start_server(self): 

        thread = threading.Thread(target=self.run_server(), name=self.server_name) 

        thread.start() 


    def run_server(self): 

        self.server_socket.bind((self.host_name, self.host_port)) # bind to host 

        self.server_socket.listen() 

        while not self.is_shutdown: 

            conn, addr = self.server_socket.accept() 

            self.handle_request(conn, addr) 


    def handle_request(self, connection, address): 

        print(str(address[0]) + " Connected! (port " + str(address[1]) + ")") 

        result = self.parse_request(connection.recv(buffer_size)) 

        if result == 0: 

            page = self.parse_response(200) 

        else: 

            page = self.parse_response(404) 

        connection.sendall(bytes(page)) 


    def parse_request(self, data): 

        if len(data) == 0: 

            return 

        strings = str(bytes(data).decode('utf-8')).split('\r\n') 

        command, path, version = strings[0].split() 

        print("command - " + command) 

        print("path - " + path) 

        print("version - " + version) 


        status = 1 


        if path == "/": 

            status = 0 


        return status 


    def parse_response(self, code): 

        status = "ERROR" 

        if code == 200: 

            status = "OK" 

        elif code == 404: 

            status = "NOT FOUND" 


        base_header = (default_header_status % {'code': code, 'status': status}) 

        base_content_type = default_header_content_type 

        # page = (default_error_page % {'code': code, 'status': status}) 

        page = str(get_page(code)) 

        return_string = str(base_header + base_content_type + page).encode('utf-8') 

        print(return_string) 

        return return_string 



def main(): 

    server = BaseServer("Home Server") 

    server.start_server() 




if __name__ == "__main__": 

    main() 

그리고 이것은 HTML입니다 :

<html> 


<head> 

<link rel="stylesheet" type="text/css" href="/style/main.css"/> 

<style> 

    *{ 

    padding:0; 

    margin:0; 

} 

body{ 

    background-color:#ffe6b3; 

} 

h1{ 

    margin-top:30px; 

    background-color:#ffcc66; 

    font-size:3em; 

    display:inline-block; 

    color:#3a0000; 

} 

p{ 

    margin-top:80px; 

    font-size:2em; 

    color:#3a0000; 

} 

#img404{ 

    background-image:url(../images/404.gif); 

    width:100%; 

    height:50%; 

    background-repeat:no-repeat; 

    background-position:center 20%; 

} 

</style> 

</head> 


<body> 

    <center> 

     <div class=top> 

      <h1>ERROR 404</h1> 

     </div> 

     <p> 

     Sorry, we could not find the page :(

     </p> 

     <div id="img404"> 


     </div> 

    </center> 

</body> 


</html> 

죄송합니다. 매우 읽을 수는 없지만 전화를 걸었습니다.

디마.

+0

, 죄송합니다. 오류가 있거나 이상하지 않은 것이 있으면보십시오. 나는 지금 전화하고있어 매우 편리하지는 않다. –

답변

0

에 상대 경로 내 문제를 알아 냈어. 로그를보고 나면 브라우저가 이미지에 대해 다른 요청을 보내는 것을 알게되었습니다. 그리고 나를 바보, 내 코드는 다음과 같습니다

if path ="/": 
    status = 0 
else: 
    status = 1 

그래서 루트가 아닌 모든 요청 ("/")의 서버가 반환됩니다 (404)

아차

내가 코드를 추가 한
0

이미지에 상대 경로 (예 : ../images/img.gif)를 사용하지 마십시오. 오히려 전체 URL 또는 url을 루트와 관련하여 사용하십시오.

+0

그럴 필요는 없습니다. 문제가 발생했습니다. 브라우저가 이미지를 요청하고 내 서버가 "/"이 아닌 모든 경로에 대해 404를 반환하기 때문에 ... 죄송합니다. –

관련 문제