This commit is contained in:
@@ -249,6 +249,12 @@ python webserver.py --port 8080
|
|||||||
- Check that asset files are properly referenced in HTML
|
- Check that asset files are properly referenced in HTML
|
||||||
- Verify file permissions on asset files
|
- Verify file permissions on asset files
|
||||||
|
|
||||||
|
#### AttributeError: 'Application' object has no attribute 'remote'
|
||||||
|
This error occurs with older versions of aiohttp. The web server has been updated to use the correct request attributes:
|
||||||
|
- Uses `request.transport.get_extra_info("peername")` for client IP
|
||||||
|
- Handles cases where transport is not available
|
||||||
|
- Falls back to "unknown" for client identification
|
||||||
|
|
||||||
### Debug Mode
|
### Debug Mode
|
||||||
|
|
||||||
For more verbose logging, modify the logging level:
|
For more verbose logging, modify the logging level:
|
||||||
|
|||||||
24
webserver.py
24
webserver.py
@@ -387,13 +387,32 @@ class SnapshotsWebServer:
|
|||||||
async def logging_middleware(request, handler):
|
async def logging_middleware(request, handler):
|
||||||
start_time = datetime.now()
|
start_time = datetime.now()
|
||||||
|
|
||||||
|
# Get client IP address
|
||||||
|
def get_client_ip():
|
||||||
|
# Check for forwarded header first
|
||||||
|
forwarded = request.headers.get("X-Forwarded-For")
|
||||||
|
if forwarded:
|
||||||
|
return forwarded.split(",")[0].strip()
|
||||||
|
|
||||||
|
# Try to get from transport
|
||||||
|
try:
|
||||||
|
if request.transport:
|
||||||
|
peername = request.transport.get_extra_info("peername")
|
||||||
|
if peername:
|
||||||
|
return peername[0]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return "unknown"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = await handler(request)
|
response = await handler(request)
|
||||||
|
|
||||||
# Log the request
|
# Log the request
|
||||||
duration = (datetime.now() - start_time).total_seconds()
|
duration = (datetime.now() - start_time).total_seconds()
|
||||||
|
remote_addr = get_client_ip()
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"{request.remote} - {request.method} {request.path} - "
|
f"{remote_addr} - {request.method} {request.path} - "
|
||||||
f"{response.status} - {duration:.3f}s"
|
f"{response.status} - {duration:.3f}s"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -401,8 +420,9 @@ class SnapshotsWebServer:
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
duration = (datetime.now() - start_time).total_seconds()
|
duration = (datetime.now() - start_time).total_seconds()
|
||||||
|
remote_addr = get_client_ip()
|
||||||
self.logger.error(
|
self.logger.error(
|
||||||
f"{request.remote} - {request.method} {request.path} - "
|
f"{remote_addr} - {request.method} {request.path} - "
|
||||||
f"ERROR: {e} - {duration:.3f}s"
|
f"ERROR: {e} - {duration:.3f}s"
|
||||||
)
|
)
|
||||||
raise
|
raise
|
||||||
|
|||||||
Reference in New Issue
Block a user