Django- Form&Auth&验证码&富文本&缓存

day07 Form&Auth&验证码&富文本&缓存

一. Form&Auth

Form有非常多使用方法,丰富的内容,我这里只做一个表单验证
Form的验证思路
前端:form表单
后台:创建form类,当请求到来时,先匹配,匹配出正确和错误信息。

在这里插入图片描述

# Form的使用
class RegisterForm(forms.Form):
    # 使用表单做校验
    # 表示username字段必须填写,且最大不超过16字符,最小不低于6字符
    
    username = forms.CharField(
    # 此处对应的html中表单的input的name
    # <input type="text" name="username">中的username
        required=True,  # 不能为空
        max_length=16,  # 最大长度为16
        min_length=6,   # 最小长度为6
        #  不满足则报错,内容为下方对应的信息
        error_messages={
            'required': "注册用户名必须填写",
            'max_length': '注册账号最长不超过16',
            'min_length': '注册账号最小不少于6',
        }
    )
    
	def clean(self):
        # 用户名是否注册
        # 此处得到的是清洗过的数据,简单来说就是上方没有报错的数据
        username = self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
        	# 此处raise主动抛出异常,将错误信息保存在username中
            raise forms.ValidationError({'username': '账号已存在!'})
        # 检测重复密码
        pwd1 = self.cleaned_data.get('pwd1')
        pwd2 = self.cleaned_data.get('pwd2')
        if pwd1 != pwd2:
            raise forms.ValidationError({'pwd2': '两次密码不一致'})
        return self.cleaned_data	   
      
# 视图函数
def register(request):
    if request.method == 'POST':
    	# 这里我们需要导入我们写的form.py中的RegisterForm,将request的POST传入,
    	# 因为我们在html的表单中是以POST进行提交的,所以需要POST进行接收
    	
        form = RegisterForm(request.POST)
        # 这里验证我们得到的form是否有效
        if form.is_valid():
            # 验证成功
            # 所有清洗过的数据都存在form.cleaned_data中,只需要使用get()取出就好了
            username = form.cleaned_data.get('username')
            pwd1 = form.cleaned_data.get('pwd1')
			# models:创建一个用户
            User.objects.create_user(
                username=username,
                password=pwd1
            )
            # 注册成功,重定向到登陆
            return redirect(reverse('App:login'))
        else:
            # 验证失败,重新渲染注册页面,form.errors是我们在form中抛出的异常信息,所有的
            # 异常信息都会保存到erros中,将他传到html,再errors.username,erros.pwd2取出
            return render(request, 'register.html', {'errors': form.errors})


Auth
Django内置了强大的用户认证系统auth,它默认使用 auth_user 表来存储用户数据。
在INSTALLED_APPS中添加'django.contrib.auth'使用该APP, auth模块默认启用。

auth 模块
创建超级用户:python manage.py createsuperuser

auth.authenticate():验证用户名和密码是否正确,一般需要username、password,认证成功返回一个User对象。
auth.login():将认证通过后的User对象注入request.user属性,会在后端为该用户生成相关session数据。
auth.logout():调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

is_authenticated():判断是否认证。
login_requierd():auth给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
	- 若用户没有登录,则会跳转到django默认的登录URL '/accounts/login/' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)- 如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
	- LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

create_user():创建一个新用户,需要username、password等。
create_superuser():创建一个超级用户。
 * check_password():检查密码是否正确。
 * set_password():修改密码,设置完一定要调用用户对象的save方法。

二.验证码

在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。

验证码需要使用绘图 Pillow
	pip install Pillow
	
核心
	Image,ImageDraw,ImageFont
	
绘制流程
		backgroundcolor = (10,20,30)   RGB颜色
	初始化画布 
    	image = Image.new('RGB',(100,50),backgroundcolor)
	获取画布中画笔对象
		draw = ImageDraw.Draw(image)
	绘制验证码,随机四个
        font = ImageFont.truetype('path',size)
        fontcolor = (20,40,60)
        draw.text((x,y),'R',font,fontcolor)
	最后扫尾
		del draw 
	
        import io
        buf = io.BytesIO()
        Image.save(buf, 'png')
        return HttpResponse(buf.getvalue(),'image/png')

三.富文本

富文本:Rich Text Format(RTF),是由微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方

tinymce 插件

django的插件
	pip install django-tinymce

用处大约有两种
	1. 在后台管理中使用
	2. 在页面中使用,通常用来作博客

1.后台中使用:
	配置settings.py文件
		INSTALLED_APPS 添加  tinymce 应用
		添加默认配置
			TINYMCE_DEFAULT_CONFIG = {
				'theme':'advanced',
				'width':600,
				'height':400,
			}
	创建模型类
        from tinymce.models import HTMLField
        class Blog(models.Model):
            sBlog = HTMLField()
	配置站点
		admin.site.register

        
2.在视图中使用:
	使用文本域盛放内容
	<form>
		<textarea></textarea>
	</form>
	
    在head中添加script
    <script src='/static/tiny_mce/tiny_mce.js'></script>
    <script>
        tinyMCE.init({
            'mode':'textareas', 'theme':'advanced',
            'width':800,'height':600,
        })
    </script>
    

四. Cache

缓存
  • django内置了缓存框架,并提供了几种常用的缓存
    • 基于Memcached缓存
    • 使用数据库进行缓存
    • 使用文件系统进行缓存
    • 使用本地内存进行缓存
    • 提供缓存扩展接口
缓存配置
  1. 创建缓存表

    python manage.py createcachetable [table_name]
    
  2. 缓存配置

设置默认缓存数据库
 CACHES = {
     'default': {
         'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
         'LOCATION': 'my_cache_table',
         'TIMEOUT': '60',
         'OPTIONS': {
             'MAX_ENTRIES': '300',
         },
         'KEY_PREFIX': 'jack',
         'VERSION': '1',
     }
 }
    # 使用redis缓存
  # 1、安装插件pip install django_redis
  # 2、在settings中配置
  # 3、启动redis服务:redis-server
  # 4、启动redis客户端:redis-cli,查看数据库2中的缓存内容
CACHES = {
  'default': {
      'BACKEND': 'django_redis.cache.RedisCache',
      "LOCATION":"redis://127.0.0.1:6379/2",
      'OPTIONS': {
          "CLIENT_CLASS":"django_redis.client.DefaultClient",
          # "PASSWORD" : "密码"
      },
      'KEY_PREFIX': 'QF',
  }
}
缓存使用
  • 在视图中使用(使用最多的场景),直接加上装饰器就可以
  • @cache_page()
    • time 秒 60*5 缓存五分钟
    • cache 缓存配置, 默认default,
    • key_prefix 前置字符串
缓存底层

获取cache

from django.core.cache import cache
cache = cache['cache_name'] 或 cache = cache.get('cache_name')

设置cache

from django.core.cache import cache
cache.set(key, value, timeout)

使用原生缓存来实现

def get_user_list(request):
    
    # 每次从缓存中获取
    user_cache = cache.get('user_cache')
	
    # 如果有缓存,则从缓存中直接取
    if user_cache:
        result = user_cache
	
    # 如果没有缓存,则从数据库中获取
    else:
        # 模拟长时间的数据操作
        user_list = User.objects.all()
        time.sleep(5)
		
        data = {
            'users': user_list,
        }
		
        # 使用模板渲染,得到result文本
        template = loader.get_template('App/stu_list.html')
        result = template.render(data)
                
        # 设置缓存
        cache.set('user_cache', result, 10)

    return HttpResponse(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Django中使用django-simple-captcha生成验证码可以通过以下步骤现: 1. 安装django-simple-captcha库: 在终端中运行以下命令安装django-simple-captcha库: ``` pip install django-simple-captcha ``` 2. 在Django项目的`settings.py`文件中添加`captcha`应用: 打开`settings.py`文件,找到`INSTALLED_APPS`列表,将`&#39;captcha&#39;`添加到其中。 3. 运行数据库迁移: 在终端中运行以下命令,将`captcha`应用的数据库迁移到你的项目中: ``` python manage.py migrate captcha ``` 4. 在需要生成验证码的表单中添加验证码字段: 在你的表单类中导入`CaptchaField`,并将其作为一个字段添加到表单中。例如: ```python from captcha.fields import CaptchaField class MyForm(forms.Form): # 其他字段... captcha = CaptchaField() ``` 5. 在视图函数中验证验证码: 在你的视图函数中,可以通过调用`form.is_valid()`来验证验证码是否正确。例如: ```python def my_view(request): if request.method == &#39;POST&#39;: form = MyForm(request.POST) if form.is_valid(): # 验证码正确,执行相应的逻辑 # ... else: # 验证码错误,处理错误信息 # ... else: form = MyForm() return render(request, &#39;my_template.html&#39;, {&#39;form&#39;: form}) ``` 6. 在模板中显示验证码输入框: 在你的模板文件中,可以通过`form.captcha`来渲染验证码输入框。例如: ```html &lt;form method=&quot;post&quot;&gt; {% csrf_token %} {{ form.as_p }} &lt;button type=&quot;submit&quot;&gt;提交&lt;/button&gt; &lt;/form&gt; ``` 这样,你就可以在Django中使用django-simple-captcha生成验证码了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值