from django.shortcuts import render
from .models import BookInfo
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import redirect

# Create your views here.

def index(request):
    return HttpResponse('<h1>Index</h1>')

def temp_var(request):
    """模拟模板中几种类型的变量"""
    my_dict = {"title":'字典的键值'}  # 字典类型
    my_list = [1, 2, 3]  # 列表类型
    book = BookInfo.objects.get(id=38)  # 对象类型
    context = {'my_dict':my_dict, 'my_list':my_list, 'book':book}
    return render(request, 'models/temp_var.html', context)

def temp_tags(request):
    """通过模板标签展示数据库内容"""
    books = BookInfo.objects.all()
    return render(request, 'models/temp_tags.html', {'books':books})

def temp_filter(request):
    """通过过滤器变更内容的显示形式"""
    books = BookInfo.objects.all()
    return render(request, 'models/temp_filter.html', {'books':books})

def temp_inhert(request):
    """显示继承父模板的子模版页面"""
    return render(request, 'models/child.html')

def html_escape(request):
    """将内容传入转义示例模板"""
    return render(request, 'models/html_escape.html', {'content':"<h2>Hello</h2>"})


def login(request):
    return render(request, 'models/login.html')

# 定义用户登陆页面，登陆后跳转到修改密码页面
def login_check(request):
    username = request.POST.get("username")
    password = request.POST.get("password")
    # 2.进行登陆校验
    if username == 'hana' and password == '123':
        # 记住登陆的用户名, 用于修改密码时展示
        request.session['username'] = username
        # 存储用户的登陆状态
        request.session['islogin'] = True
        # 重定向对象后面不加 .html
        response = redirect('/models/change_pwd/')
        return response
    # 如果错误，跳转回登陆页面
    else:
        return redirect('/models/login/')

# 创建一个装饰器，用于验证用户登陆状态
def login_required(view_func):
    def wrapper(request, *view_args, **view_kwargs):
        # 判断用户是否已经登陆
        if request.session.has_key('islogin'):
            return view_func(request, *view_args, **view_kwargs)
        else:
            return redirect('/models/login/')
    return wrapper

@login_required
def change_pwd(request):
    # # 判断用户是否已经登陆
    # if not request.session.has_key('islogin'):
    #     return redirect('/models/login/')
    return render(request, 'models/change_pwd.html')

@login_required
def change_pwd_action(request):
    # # 判断用户是否已经登陆
    # if not request.session.has_key('islogin'):
    #     return redirect('/models/login/')
    # 1.获取用户名和新密码
    username = request.session.get('username')
    password = request.POST.get('password')
    # 2.在实际操作中，要修改数据库中的内容，此处直接略过
    # 3.返回应答
    return HttpResponse('%s将密码修改为:%s' % (username, password))

from PIL import Image, ImageDraw, ImageFont
from django.utils.six import BytesIO


# 添加验证码的视图函数
# /verify_code
def verify_code(request):
    # 引入随机函数模块
    import random
    # 定义变量，用于画面的背景色、宽、高 RGB
    bgcolor = (random.randrange(20, 100), random.randrange(
        20, 100), 255)
    width = 100
    height = 25
    # 创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    # 创建画笔对象
    draw = ImageDraw.Draw(im)
    # 调用画笔的point()函数绘制噪点
    for i in range(0, 100):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        draw.point(xy, fill=fill)

    # 定义验证码的备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # 随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]

    # 构造字体对象，ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
    # 必须得是系统目录下存在的字体文件，第二个参数是字号
    font = ImageFont.truetype('DejaVuSans.ttf', 20)
    # 使用系统默认字体
    # font = ImageFont.load_default().get_size(23)
    # 构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    # 绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    # 释放画笔
    del draw
    # 存入session，用于做进一步验证
    request.session['verifycode'] = rand_str
    # 内存文件操作
    buf = BytesIO()
    # 将图片保存在内存中，文件类型为png
    im.save(buf, 'png')
    # 将内存中的图片数据返回给客户端，MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')

# url中反向解析步骤
# 1.在项目目录的 urls 中添加应用目录的 namespace 参数
# 2.在应用目录的 urls 顶端注册应用名 app_name
# 3.添加对应的视图函数，并配置视图功能
# 4.在应用目录中配置URLconf，对需要反向解析的url添加name属性
# 5.在模板文件中添加配置 url反向解析 的标签

# 添加url反向解析页面
def url_reverse(request):
    return render(request, 'models/url_reverse.html')

def show_args(request, a, b):
    return HttpResponse(a + ", " + b)

def show_kwargs(request, c, d):
    return HttpResponse(c + ", " + d)

# 定义可以重定向的视图函数
# django1.x 中 reverse 调用方法
# from django.core.urlresolvers import reverse
# django2.x 中 reverse 调用方法
from django.urls import reverse
def test_redirect(request):
    # 访问此页面，重定向到指定页面
    # 1.重新定向到主页
    url = reverse('models:index')
    # 2.重新定向到 show_args, 添加一个元组，用于存储位置参数
    url = reverse('models:show_args', args=(1, 2))
    # 3.重新定向到 show_kwargs, 添加一个字典，用于存储关键字参数
    url = reverse('models:show_kwargs', kwargs={'c':3, 'd':4})
    return redirect(url)

def static_test(request):
    """设置访问静态文件的视图函数"""
    return render(request, 'models/static_test.html')