You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
myblog/App/views.py

348 lines
16 KiB

import mimetypes
from django.contrib import messages
from django.contrib.auth import authenticate
from django.db.models import F, QuerySet, Count
from django.http import JsonResponse, StreamingHttpResponse, FileResponse
from django.shortcuts import HttpResponse, render, redirect, reverse
from django.contrib.auth.decorators import login_required
from django.views.decorators.cache import cache_page
from django.core.cache import cache
from django.conf import settings
from .forms import *
from .models import *
from .qingcloud import putImage
import datetime, requests, json, re, os
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.clickjacking import xframe_options_sameorigin
from .csdn import get_image
from wsgiref.util import FileWrapper
from urllib.parse import quote
#@cache_page(60 * 15)
def index(request):
name = None
if request.user.is_authenticated:
name = User.last_name
data = cache.get('csdn')
if data is None:
with open('App/csdn.json', 'r', encoding='utf-8') as f:
data = json.load(f)
return render(request, 'index.html', {'name': name, 'data': data})
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('loginName')
password = form.cleaned_data.get('loginPass')
user = authenticate(username=username, password=password)
auth.login(request, user)
info = getAddr(request.META['REMOTE_ADDR'])
if info['status'] == 'success':
Login.objects.create(username=username, client_addr=info['query'], city=info['city'],
country=info['country'], region=info['regionName'], latitude=info['lat'],
longitude=info['lon']).save()
else:
Login.objects.create(username=username, client_addr=request.META['REMOTE_ADDR']).save()
url = request.GET.get('next', '/')
return redirect(url)
else:
return render(request, 'login.html', {'errors': form.errors})
else:
return render(request, 'login.html')
@login_required
def userinfo(request):
login_data = Login.objects.filter(username=request.user.username).order_by('-login_time')[:5]
image_data = Upload.objects.filter(username=request.user.username).order_by('-upload_time')[:5]
blog_data = paper.objects.filter(username=request.user.username).order_by('-paper_time')[:5]
task_data = Task.objects.filter(username=request.user.username).order_by('-task_time')[:5]
return render(request, 'function/user.html', {'name': auth.get_user(request).username, 'login_data': login_data, 'image_data': image_data, 'blog_data': blog_data, 'task_data': task_data, 'regtime': auth.get_user(request).date_joined})
def logout(request):
auth.logout(request)
return redirect(reverse('App:index'))
@login_required
def repassword(request):
return HttpResponse('功能尚未支持,修改密码请联系管理员')
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
first_name = form.cleaned_data.get('fname')
last_name = form.cleaned_data.get('lname')
username = form.cleaned_data.get('username')
email = request.POST.get('email')
password = form.cleaned_data.get('password')
likes = request.POST.getlist('like')
role = request.POST.get('role')
try:
User.objects.create_user(username=username, email=email, password=password, first_name=first_name,
last_name=last_name, is_staff=role, likes=likes)
except Exception as e:
return render(request, 'register.html', {'errors': e})
return redirect(reverse('App:login'))
else:
return render(request, 'register.html', {'errors': form.errors})
else:
return render(request, 'register.html')
@cache_page(60)
@login_required
def dashboard(request, type):
username = auth.get_user(request).username
if request.GET.get('time') == 'week':
t = 6
elif request.GET.get('time') == 'month':
t = 29
elif request.GET.get('time') == 'year':
t = 364
elif request.GET.get('time') == 'quarter':
t = 90
else:
t = 6
if type == 'login':
data = getData(username, t)
table = Login.objects.filter(username=username).order_by('-login_time').all()[:30]
elif type == 'docs':
data = getData(username, t, 'docs')
table = Upload.objects.filter(username=username).order_by('-upload_time').all()[:100]
elif type == 'blog':
data = getData(username, t, 'blog')
table = paper.objects.order_by('-paper_time').all()[:100]
elif type == 'video':
data = getData(username, t, 'video')
table = videoUpload.objects.order_by('-video_time').all()[:100]
else:
data = table = ""
return render(request, 'nav/dashboard.html', {'data': data, 'table': table, 'type': type})
@xframe_options_sameorigin
@csrf_exempt
@login_required
def upload(request):
ftype = request.GET.get('type')
if request.method == 'POST':
if ftype == 'videos':
file = request.FILES.getlist('file', None)
data = {'status': 'success', 'msg': []}
today = str(datetime.date.today())
file_path = os.path.join(settings.MEDIA_ROOT, 'videos',today)
for i in file:
if '@' in i.name:
file_type = i.name.split('@')[0]
i.name = i.name.split('@')[1]
else:
file_type = 'other'
file_path = os.path.join(file_path, file_type)
if not os.path.exists(file_path):
os.makedirs(file_path)
file_path = os.path.join(file_path, i.name)
video = videoUpload.objects.filter(username=auth.get_user(request).username, video_title=i.name,
video_size=i.size)
if video.exists():
import shutil
shutil.move(os.path.join(settings.MEDIA_ROOT,str(video.get().video_path).replace('/upload/','')), file_path)
video.update(video_time=today, video_path=os.path.join('/upload/videos/',file_path.split(r"videos")[-1][1:].replace('\\','/')))
else:
image = get_image('215x280', file_type)
videoUpload.objects.create(username=auth.get_user(request).username, video_title=i.name, video_size=i.size, video_time=today, video_path=os.path.join('/upload/videos/',file_path.split(r"videos")[-1][1:].replace('\\','/')), video_image=image, video_desc=file_type)
with open(file_path, 'wb') as f:
for chunk in i.chunks():
f.write(chunk)
if data:
return HttpResponse(json.dumps(data))
elif ftype == 'editmd':
file = request.FILES.get('editormd-image-file')
url_path = putImage(file)
if Upload.objects.filter(username=auth.get_user(request).username, file_name=file.name,file_size=file.size).exists():
Upload.objects.filter(file_name=file.name, file_size=file.size).update(upload_time=datetime.datetime.now())
else:
Upload.objects.create(username=auth.get_user(request).username, file_name=file.name, file_path=file.name,file_size=file.size, url_path=url_path['url']).save()
data = {'success': 1, 'message': "上传成功", 'url': url_path['url']}
return JsonResponse(data)
else:
file = request.FILES.getlist('file', None)
data = {'status': 'success', 'msg': []}
for i in file:
if Upload.objects.filter(username=auth.get_user(request).username,file_name=i.name,file_size=i.size).exists():
Upload.objects.filter(file_name=i.name,file_size=i.size).update(upload_time=datetime.datetime.now())
else:
url_path = putImage(i)
data['msg'].append(url_path)
Upload.objects.create(username=auth.get_user(request).username, file_name=i.name, file_path=i.name, file_size=i.size, url_path=url_path['url']).save()
if data:
return HttpResponse(json.dumps(data))
return render(request, 'nav/upload.html', {'type': ftype})
# 功能函数
def getData(username, time, type='login'):
data = {}
for i in range(time, -1, -1):
date = datetime.date.today() - datetime.timedelta(days=i)
if type == 'login':
data.update({str(date): Login.objects.filter(username=username, login_time__startswith=date).count()})
elif type == 'docs':
data.update({str(date): Upload.objects.filter(username=username, upload_time__startswith=date).count()})
elif type == 'blog':
data.update({str(date): paper.objects.filter(paper_time__startswith=date).count()})
elif type == 'video':
data.update({str(date): videoUpload.objects.filter(video_time__startswith=date).count()})
return data
def getAddr(ip):
ip = requests.get('https://httpbin.org/ip').json()['origin']
info = requests.get('http://ip-api.com/json/' + ip + '?lang=zh-CN')
info = info.json()
return info
@login_required
def listImage(request):
image = Upload.objects.filter(username=auth.get_user(request).username).all().order_by('-upload_time')
return render(request, 'nav/image.html', {'image': image})
@login_required
def listTask(request):
task = Task.objects.all()
return render(request, 'task/tasklist.html', {'task': task})
def addTask(request):
if request.method == 'POST':
task_title = request.POST.get('title')
image = request.POST.get('bimage')
if not image :
image = 'https://py-put.gd2.qingstor.com/0bb68da4b7edd5ad21bee1f9ece0bdca5871f5a9.jpg'
data = {}
now = datetime.datetime.now()
data.update({'backend_image': image, 'userlist': {}.fromkeys(request.POST.get('userlist').split(','),{'status':'未完成','update_time': str(now)}), 'desc': request.POST.get('desc')})
Task.objects.create(username=auth.get_user(request).username,task_title=task_title, task_content=json.dumps(data, ensure_ascii=False),).save()
return redirect(reverse('App:listTask'), {'messages': task_title + '添加成功'})
return render(request, 'task/taskcreate.html')
@login_required
def checkTask(request, id):
if request.method == 'POST':
task = Task.objects.get(id=id)
jsondata = json.loads(task.task_content)
jsondata['userlist'][request.GET.get('name')] = {'status': '已完成', 'update_time': str(datetime.datetime.now())}
Task.objects.filter(id=id).update(task_content=json.dumps(jsondata, ensure_ascii=False))
return redirect(reverse('App:checkTask', kwargs={'id': id}))
data = Task.objects.filter(id=id).get()
userdata = json.loads(data.task_content)
return render(request, 'task/detailed.html', {'data': userdata['userlist'],'id':id})
@csrf_exempt
@login_required
def editMD(request, id=None):
if request.method == 'POST':
title = request.POST.get('title')
desc = request.POST.get('desc')
text = request.POST.get('test-editormd-markdown-doc')
image = get_image('200x300')
if paper.objects.filter(username=auth.get_user(request).username, paper_title=title).exists():
paper.objects.filter(username=auth.get_user(request).username,paper_title=title).update(paper_desc=desc, paper_content=text, paper_time=datetime.datetime.now())
else:
paper.objects.create(username=auth.get_user(request).username, paper_title=title, paper_desc=desc,
paper_content=text, paper_image=image).save()
return redirect(reverse('App:paperList'))
else:
data = {}
if f'{id}'.isdigit():
data = paper.objects.filter(id=id).get()
return render(request, 'function/edit.html', {'data': data})
def paperList(request):
data = paper.objects.all().order_by('-paper_time')
thumbs_up = {}
for i in data:
thumbs_up[i.id] = thumbs.objects.filter(paper_id=i.id).count()
return render(request, 'nav/paperlist.html', {'data': data, 'thumbs': thumbs_up, 'username': auth.get_user(request).username})
def paperDetail(request, id):
if request.method == 'POST':
if thumbs.objects.filter(username=auth.get_user(request).username, paper_id=id).exists():
thumbs.objects.filter(username=auth.get_user(request).username, paper_id=id).delete()
else:
thumbs.objects.create(username=auth.get_user(request).username, paper_id=paper.objects.filter(id=id).get()).save()
return redirect(reverse('App:paperDetail', kwargs={'id': id}))
data = paper.objects.filter(id=id).get()
if data:
paper.objects.filter(id=id).update(views=paper.objects.filter(id=id).get().views+1)
return render(request, 'function/viewmd.html', {'data': data, 'thumbs': thumbs.objects.filter(paper_id=id).count()})
def videoView(request, id):
if request.method == 'GET':
data = videoUpload.objects.filter(id=id).get()
return render(request, 'nav/videoview.html', {'path': data.video_path})
def videoList(request):
video_type = request.GET.get('video_type', '全部内容')
if video_type == '全部内容':
data = videoUpload.objects.all().order_by('video_title', '-video_time')
else:
data = videoUpload.objects.filter(video_desc=video_type).all().order_by('video_title','-video_time')
desc = videoUpload.objects.all().values('video_desc').distinct()
desc = [i['video_desc'] for i in desc]
desc.append('全部内容')
return render(request, 'nav/videolist.html', {'data': data, 'desc': desc, 'selected': video_type})
def file_iterator(file_name, chunk_size=8192, offset=0, length=None):
with open(file_name, "rb") as f:
f.seek(offset, os.SEEK_SET)
remaining = length
while True:
bytes_length = chunk_size if remaining is None else min(remaining, chunk_size)
data = f.read(bytes_length)
if not data:
break
if remaining:
remaining -= len(data)
yield data
def stream_video(request):
"""将视频文件以流媒体的方式响应"""
range_header = request.META.get('HTTP_RANGE', '').strip()
range_re = re.compile(r'bytes\s*=\s*(\d+)\s*-\s*(\d*)', re.I)
range_match = range_re.match(range_header)
path = request.GET.get('path')
#这里根据实际情况改变,我的views.py在core文件夹下但是folder_path却只到core的上一层,media也在core文件夹下
folder_path = os.getcwd().replace('\\', '/')
path=folder_path+path #path就是template ?后面的参数的值
size = os.path.getsize(path)
content_type, encoding = mimetypes.guess_type(path)
content_type = content_type or 'application/octet-stream'
if range_match:
first_byte, last_byte = range_match.groups()
first_byte = int(first_byte) if first_byte else 0
last_byte = first_byte + 1024 * 1024 * 10
if last_byte >= size:
last_byte = size - 1
length = last_byte - first_byte + 1
resp = StreamingHttpResponse(file_iterator(path, offset=first_byte, length=length), status=206, content_type=content_type)
resp['Content-Length'] = str(length)
resp['Content-Range'] = 'bytes %s-%s/%s' % (first_byte, last_byte, size)
else:
resp = StreamingHttpResponse(FileWrapper(open(path, 'rb')), content_type=content_type)
resp['Content-Length'] = str(size)
resp['Accept-Ranges'] = 'bytes'
return resp
def videoDownload(request, id):
data = videoUpload.objects.filter(id=id).get()
file_path = str(data.video_path)[1:]
file_name = os.path.basename(file_path)
file = open(file_path, 'rb')
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{}"'.format(quote(file_name))
#messages.error(request, '下载成功')
return response