@Drovosek01

В Linux в python относительные пути работают «нативно»?

Смотрю гайд: https://youtu.be/4haMUvUxUJI?t=2055 и там на 34:15 в метод open() передают путь к html файлу. Путь относительный и без использования os.path
Этот такая особенность python в Linux или настроена переменная PATH, чтобы она искала файлы в той папке, где находятся подключаемые html файлы?

И еще у меня без аргумента "encoding='utf-8'" в методе open(), html файл нормально не открывается, а там на видео все норм, это тоже особенность Linux?

Большое спасибо за урок!
Подскажите, пожалуйста, 2 вещи.

P.S.
Еще почему-то не подгружается файл со стилями. В Chrome DevTools посмотрел, там GET запрос к css файлу идет сразу к localhost:5000/style.css и потом сервер вываливается с ошибкой KeyError: '/style.css'. Пришлось писать стили напрямую в html файле. Есть идеи как это пофиксить?

import socket
from views import *


URLS = {
    '/': index,
    '/blog': blog
}

def generate_content(method, url):
    # if method == 404:
    #     return '<h1>404</h1><p>Not found</p>'
    # if method == 405:
    #     return '<h1>405</h1><p>Method not allowed</p>'
    # return '<h1>{}</h1>'.format(URLS[url])
    return URLS[url]()

def generate_headers(method, url):
    if method != 'GET':
        return ('HTTP/1.1 405 Method not allowed\n\n', 405)

    if url not in URLS:
        return('HTTP/1.1 404 Not found\n\n', 404)

    return ('HTTP/1.1 200 OK\n\n', 200)

def parse_request(request):
    parsed = request.split(' ')
    method = parsed[0]
    url = parsed[1]
    parsed_lines = request.split('\r\n\r\n')
    print('-----PARSED_LINE-----', parsed_lines)
    return (method, url)

def generate_response(request):
    method, url = parse_request(request)
    headers, code = generate_headers(method, url)
    body = generate_content(method, url)
    return (headers + body).encode()

def run():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind(('localhost', 5000))
    server_socket.listen(1)

    while True:
        client_socket, addr = server_socket.accept()
        request = client_socket.recv(1024)
        print(request.decode('utf-8'))
        print()
        print(addr)

        response = generate_response(request.decode('utf-8'))
        # client_socket.sendall('hello world'.encode())
        client_socket.sendall(response)
        client_socket.close()

if __name__ == '__main__':
    run()

views.py
import os


dir = os.path.dirname(__file__)

def index():
    with open(os.path.join(dir,'templates/index.html'), encoding='utf-8') as template:
        return template.read()

def blog():
    with open(r'templates/blog.html', encoding='utf-8') as template:
        return template.read()
  • Вопрос задан
  • 1704 просмотра
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Я не смотрел видео, но
  1. Хорошие программы на Python должны быть кроссплотформенными, соответственно стоит избегать путей с разделителями и использовать os.path.join() и другие переносимые средства работы с путями.
  2. Если вы используете Python2, то используйте Python3. А если используете Python3, то всегда указывайте кодировку при открытии файла и всегда используйте UTF-8 для кодирования файлов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы