from django.db.models.functions import TruncDate
from django.views.generic import TemplateView
from django.shortcuts import render, HttpResponse
from .models import WebPage, Type, HistoryInfo
from django.views import View
import requests
from django.http import JsonResponse
import datetime
from django.utils import timezone
from datetime import timedelta
from django.db.models import Count
class IndexViews(View):
def get(self, request):
try:
# 记录历史信息
self.record_history_info(request)
# 获取网页和分类信息
web_models = WebPage.objects.order_by('sort')
types = Type.objects.order_by('sort')
context = {
'web_models': web_models,
'types': types,
}
# 渲染模板
return render(request, 'index/index.html', context)
except Exception as e:
return HttpResponse(f"An error occurred: {str(e)}")
def get_real_ip(self, request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0] # 所以这里是真实的ip
else:
ip = request.META.get('REMOTE_ADDR') # 这里获得代理ip
return ip
def record_history_info(self, request):
# 获取真实的客户端 IP
ip = self.get_real_ip(request)
# 初始化地理位置信息
nation, province, city = '', '', ''
# 尝试获取地理信息
if ip:
try:
response = requests.get(f'http://ip-api.com/json/{ip}?lang=zh-CN', timeout=5)
if response.status_code == 200:
data = response.json()
nation = data.get('country', '')
province = data.get('regionName', '')
city = data.get('city', '')
except requests.RequestException as e:
# 记录错误日志,或者其他错误处理
print(f"Error fetching location data for IP {ip}: {e}")
# 获取当前时间并转换为北京时间
# 将 UTC 时间转换为北京时间
beijing_time = datetime.datetime.now()
# 使用 24 小时制格式化时间
formatted_time = beijing_time.strftime('%Y-%m-%d %H:%M:%S')
print("=========================")
print(formatted_time)
# 创建历史记录
HistoryInfo.objects.create(
ip=ip,
nation=nation,
province=province,
city=city,
create_time=formatted_time
)
class DisplayViews(TemplateView):
template_name = 'index/display.html'
def get(self, request, *args, **kwargs):
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
# 如果没有传递起始和结束日期,默认选择最近7天
if not start_date or not end_date:
end_date = timezone.now().date()
start_date = end_date - timedelta(days=7)
else:
start_date = timezone.datetime.strptime(start_date, '%Y-%m-%d').date()
end_date = timezone.datetime.strptime(end_date, '%Y-%m-%d').date()
# 按天统计访问量
daily_stats = (
HistoryInfo.objects
.filter(create_time__date__gte=start_date, create_time__date__lte=end_date)
.annotate(date=TruncDate('create_time'))
.values('date')
.annotate(count=Count('id'))
.order_by('date')
)
# 转换为列表
daily_stats = list(daily_stats)
# 创建一个字典来存储日期和对应的访问量
stats_dict = {stat['date']: stat['count'] for stat in daily_stats}
# 创建一个包含最近 7 天日期的列表,并确保没有数据的日期访问量为 0
complete_stats = []
current_date = start_date
while current_date <= end_date:
complete_stats.append({
'date': current_date.isoformat(),
'count': stats_dict.get(current_date, 0) # 如果没有数据则为 0
})
current_date += timedelta(days=1)
# 统计国家和省市的访问量
country_stats = (
HistoryInfo.objects
.filter(create_time__date__gte=start_date, create_time__date__lte=end_date)
.values('nation', 'province', 'city') # 使用 'nation' 替换 'country'
.annotate(count=Count('id'))
)
# 将查询到的日期和访问量转换为字典
country_stats = [
{'nation': stat['nation'], 'province': stat['province'], 'city': stat['city'], 'count': stat['count']} for
stat in country_stats]
# 判断是否为 AJAX 请求
if request.headers.get('x-requested-with') == 'XMLHttpRequest':
# print("返回的统计数据:", complete_stats) # 打印返回的数据
return JsonResponse({'daily_stats': complete_stats, 'country_stats': country_stats}, safe=False)
else:
# print("2")
context = self.get_context_data(complete_stats=complete_stats)
return self.render_to_response(context)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
web.zip (50个子文件)
media
images
IMG_5095.JPG 540KB
itab.png 2KB
IMG_5094.JPG 152KB
IMG_5099.JPG 279KB
civitai.png 2KB
utool.png 9KB
web
__init__.py 0B
wsgi.py 399B
urls.py 1KB
settings.py 4KB
__pycache__
__init__.cpython-310.pyc 129B
wsgi.cpython-310.pyc 524B
settings.cpython-310.pyc 2KB
urls.cpython-310.pyc 1KB
asgi.py 399B
templates
index
display.html 6KB
index.html 3KB
manage.py 681B
run.py 380B
images
2.jpg 10KB
tu.jpeg 196KB
tu_eZEq3rf.jpeg 196KB
static
db.sqlite3 0B
font
image
background.jpg 279KB
logo.png 47KB
qq.png 25KB
js
chart.min.js 201KB
css
index.css 2KB
favicon.ico 47KB
apps
__init__.py 0B
index
__init__.py 434B
tests.py 62B
admin.py 1KB
migrations
__init__.py 0B
0001_initial.py 2KB
0002_historyinfo.py 877B
__pycache__
0002_historyinfo.cpython-310.pyc 813B
0001_initial.cpython-310.pyc 1KB
__init__.cpython-310.pyc 147B
apps.py 90B
models.py 2KB
urls.py 186B
__pycache__
views.cpython-310.pyc 4KB
__init__.cpython-310.pyc 636B
apps.cpython-310.pyc 356B
admin.cpython-310.pyc 1KB
urls.cpython-310.pyc 325B
models.cpython-310.pyc 2KB
views.py 5KB
__pycache__
__init__.cpython-310.pyc 130B
共 50 条
- 1
资源评论
一个小渣渣AI
- 粉丝: 103
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 九州仙侠传2砸蛋系统以及各类修复带数据库
- 伯克利大学机器学习-8Collaborative Filtering [Lester Mackey]
- JAVA的Springboot医院设备管理系统源码数据库 MySQL源码类型 WebForm
- C/C++基本框架及解释
- 使用OpenGL实现透明效果
- java房屋租赁系统源码 房屋房源出租管理系统源码数据库 MySQL源码类型 WebForm
- JAVA的Springboot博客网站源码数据库 MySQL源码类型 WebForm
- c++数字雨实现 c++
- 如何制作MC(需要下载海龟编辑器2.0,下载pyglet==1.5.15)
- JAVA的Springboot小区物业管理系统源码数据库 MySQL源码类型 WebForm
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功