#!/usr/bin/env python3
# -- coding:utf-8 --
# @Author: markushammered@gmail.com
# @Development Tool: PyCharm
# @Create Time: 2021/12/18
# @File Name: webservice.py
import socket
import threading
from core.logger import Logger
from core.read_config import read_config
from core.information import WeatherInfo
from core.language import Language
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 7898))
server.listen(5)
language = Language()
def build_html():
"""
构建html主体
:return:
"""
settings = read_config()
city = settings[3]['city-name']
mode = settings[1]['mode']
match mode:
case 'dev':
dev_weather = WeatherInfo().dev_version()
dates = dev_weather[0]
day_weathers = dev_weather[1]
night_weathers = dev_weather[2]
highest_temps = dev_weather[3]
lowest_temps = dev_weather[4]
icons = dev_weather[5]
sunset = dev_weather[6]
sunrise = dev_weather[7]
humidity = dev_weather[8]
wind_speed = dev_weather[9]
wind_scale = dev_weather[10]
wind_dir = dev_weather[11]
uv_index = dev_weather[12]
cloud = dev_weather[13]
pressure = dev_weather[14]
vis = dev_weather[15]
html = f"""
QWeather|网页查看天气服务
地区:{city}
| | 日期 |
| 天气 |
| 最低温度 |
| 最高温度 |
| 今天 |
{day_weathers[0]} /{night_weathers[0]}
 | {lowest_temps[0]}℃ |
{highest_temps[0]}℃ |
| {dates[1]} |
{day_weathers[1]} /{night_weathers[1]}
 | {lowest_temps[1]}℃ |
{highest_temps[1]}℃ |
| {dates[2]} |
{day_weathers[2]} /{night_weathers[2]}
 | {lowest_temps[2]}℃ |
{highest_temps[2]}℃ |
| {dates[3]} |
{day_weathers[3]} /{night_weathers[3]}
 | {lowest_temps[3]}℃ |
{highest_temps[3]}℃ |
| {dates[4]} |
{day_weathers[4]} /{night_weathers[4]}
 | {lowest_temps[4]}℃ |
{highest_temps[4]}℃ |
| {dates[5]} |
{day_weathers[5]} /{night_weathers[5]}
 | {lowest_temps[5]}℃ |
{highest_temps[5]}℃ |
| {dates[6]} |
{day_weathers[6]} /{night_weathers[6]}
 | {lowest_temps[6]}℃ |
{highest_temps[6]}℃ |
| |
| 风速/级/向 |
湿度 |
紫外线 |
| {wind_speed}m/s {wind_scale} {wind_dir} |
{humidity}% |
{uv_index} |
| |
| 能见度 |
压强 |
云量 |
| {vis}km |
{pressure}hPa |
{cloud}% |
| |
 |
|
 |
| {sunrise} |
--------------- |
{sunset} |
"""
return html
case 'free':
dev_weather = WeatherInfo().free_version()
dates = dev_weather[0]
day_weathers = dev_weather[1]
night_weathers = dev_weather[2]
highest_temps = dev_weather[3]
lowest_temps = dev_weather[4]
icons = dev_weather[5]
sunset = dev_weather[6]
sunrise = dev_weather[7]
humidity = dev_weather[8]
wind_speed = dev_weather[9]
wind_scale = dev_weather[10]
wind_dir = dev_weather[11]
uv_index = dev_weather[12]
cloud = dev_weather[13]
pressure = dev_weather[14]
vis = dev_weather[15]
html = f"""
QWeather|网页查看天气服务
地区:{city}
| | 日期 |
| 天气 |
| 最低温度 |
| 最高温度 |
| 今天 |
{day_weathers[0]} /{night_weathers[0]}
 | {lowest_temps[0]}℃ |
{highest_temps[0]}℃ |
| {dates[1]} |
{day_weathers[1]} /{night_weathers[1]}
 | {lowest_temps[1]}℃ |
{highest_temps[1]}℃ |
| {dates[2]} |
{day_weathers[2]} /{night_weathers[2]}
 | {lowest_temps[2]}℃ |
{highest_temps[2]}℃ |
| |
| 风速/风级/风向 |
相对湿度 |
紫外线 |
| {wind_speed}m/s {wind_scale} {wind_dir} |
{humidity}% |
{uv_index} |
| |
| 能见度 |
压强 |
云量 |
| {vis}km |
{pressure}hPa |
{cloud}% |
| |
 |
|
 |
| {sunrise} |
--------------- |
{sunset} |
"""
return html
case _:
return "You hadn't selected a mode"
def process_requests(c, a):
"""
处理请求
:param c: connection
:param a: address
:return:
"""
try:
data = str(c.recv(1024)).split(':')[0][6:][:-17]
html = build_html()
if data == '/' or '': # 判断用户请求的目标是否为根目录, 如果是则返回html; 如果不是则继续判断
c.sendto('HTTP1.1/ 200 OK\r\n\r\n'.encode('utf-8'), a)
c.sendto(html.encode('utf-8'), a)
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
else: # 继续判断用户请求的文件是否存在
try:
with open(f'.{data}', 'rb') as f:
c.sendto('HTTP1.1/ 200 OK\r\n\r\n'.encode('utf-8'), a)
c.sendto(f.read(), a)
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
except FileNotFoundError:
c.sendto(f'HTTP1.1/ 404 Not Found\r\n\r\n{html}'.encode('utf-8'), a)
except BrokenPipeError:
Logger.error(f'{language["connection_speed_too_fast"]}')
except IOError:
Logger.error(f'{language["an_io_error"]}')
finally:
c.close()
return
def accept_requests():
"""
接受请求
:return:
"""
while True:
c, a = server.accept()
threading.Thread(target=process_requests, args=(c, a,)).start()