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
资源推荐
资源预览
资源评论
2018-06-20 上传
5星 · 资源好评率100%
123 浏览量
2018-09-02 上传
5星 · 资源好评率100%
145 浏览量
5星 · 资源好评率100%
141 浏览量
5星 · 资源好评率100%
5星 · 资源好评率100%
142 浏览量
5星 · 资源好评率100%
5星 · 资源好评率100%
113 浏览量
5星 · 资源好评率100%
120 浏览量
5星 · 资源好评率100%
117 浏览量
5星 · 资源好评率100%
5星 · 资源好评率100%
5星 · 资源好评率100%
187 浏览量
5星 · 资源好评率100%
131 浏览量
5星 · 资源好评率100%
144 浏览量
198 浏览量
165 浏览量
102 浏览量
2024-03-25 上传
5星 · 资源好评率100%
5星 · 资源好评率100%
资源评论
一个小渣渣AI
- 粉丝: 125
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- FeiQ.rar 局域网内通信服务软件
- 172.16.100.195
- 光储并网simulink仿真模型,直流微电网 光伏系统采用扰动观察法是实现mppt控制,储能可由单独蓄电池构成,也可由蓄电池和超级电容构成的混合储能系统,并采用lpf进行功率分配 并网采用pq控制
- python编写微信读取smart200plc的数据发送给微信联系人
- 光储并网VSG系统Matlab simulink仿真模型,附参考文献 系统前级直流部分包括光伏阵列、变器、储能系统和双向dcdc变器,后级交流子系统包括逆变器LC滤波器,交流负载 光储并网VSG系
- file_241223_024438_84523.pdf
- 质子交膜燃料电池PEMFC Matlab simulink滑模控制模型,过氧比控制,温度控制,阴,阳极气压控制
- IMG20241223015444.jpg
- 模块化多电平变器(MMC),本模型为三相MMC整流器 控制策略:双闭环控制、桥臂电压均衡控制、模块电压均衡控制、环流抑制控制策略、载波移相调制,可供参考学习使用,默认发2020b版本及以上
- Delphi 12 控件之FlashAV FFMPEG VCL Player For Delphi v7.0 for D10-D11 Full Source.7z
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功