Django入门全套(第三部)
Posted 张岩林
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django入门全套(第三部)相关的知识,希望对你有一定的参考价值。
前两部链接
本章内容:
- Django 发送邮件
- Django cookie
- Django session
- Django CSRF
Django 发送邮件
我们常常会用到一些发送邮件的功能,比如有人提交了应聘的表单,可以向HR的邮箱发邮件,这样,HR不看网站就可以知道有人在网站上提交了应聘信息。今天我们尝试用django发送邮件做尝试
1、配置相关参数settings
往settings添加下面几行数据
EMAIL_BACKEND = \'django.core.mail.backends.smtp.EmailBackend\' EMAIL_USE_TLS = False # 邮箱服务器 EMAIL_HOST = \'smtp.163.com\' # 端口号 EMAIL_PORT = 25 # 发件邮箱账号 EMAIL_HOST_USER = \'zhangyanlin8851@163.com\' # 发件邮箱密码 EMAIL_HOST_PASSWORD = \'邮箱密码\' # 发件人 DEFAULT_FROM_EMAIL = \'zhangyanlin<zhangyanlin8851@163.com>\'
下面是一些常用的邮箱参数:
2、官方事例
2.1、先看下官方给的例子
from django.core.mail import send_mail send_mail(\'Subject here\', \'Here is the message.\', \'from@example.com\', [\'to@example.com\'], fail_silently=False)
2.2、发送多个邮件
from django.core.mail import send_mass_mail message1 = (\'Subject here\', \'Here is the message\', \'from@example.com\', [\'first@example.com\', \'other@example.com\']) message2 = (\'Another Subject\', \'Here is another message\', \'from@example.com\', [\'second@test.com\']) send_mass_mail((message1, message2), fail_silently=False)
3、发送邮件
from django.shortcuts import render,HttpResponse from django.conf import settings from django.core.mail import EmailMultiAlternatives def email(request): subject = \'来自张岩林的问候\' text_content = \'这是一封重要的邮件.\' html_content = \'<p>这是一封<strong>重要的</strong>邮件.</p>\' from_email = settings.DEFAULT_FROM_EMAIL msg = EmailMultiAlternatives(subject, text_content, from_email, [\'75501664@qq.com\']) msg.attach_alternative(html_content, "text/html") msg.send() return HttpResponse(\'OK\')
写完这段代码访问以下相对应得URL可以看看邮件有没有发送成功哟
Django Cookie
1、获取cookie
# 方式一 request.COOKIES[\'key\'] # 方式二 request.COOKIES.get(\'key\') # 方式三 request.get_signed_cookie(key, default=RAISE_ERROR, salt=\'\', max_age=None) # 参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间
2、设置cookie
rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt=\'加密盐\',...) 参数: key, 键 value=\'\', 值 max_age=None, 超时时间 expires=None, 超时时间(IE requires expires, so set it if hasn\'t been already.) path=\'/\', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被javascript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
Django Session
一、session使用
def index(request): # 获取、设置、删除Session中数据 request.session[\'k1\'] request.session.get(\'k1\',None) request.session[\'k1\'] = 123 request.session.setdefault(\'k1\',123) # 存在则不设置 del request.session[\'k1\'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key")
二、session种类
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
1、数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
配置 settings.py SESSION_ENGINE = \'django.contrib.sessions.backends.db\' # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
2、缓存Session
配置 settings.py SESSION_ENGINE = \'django.contrib.sessions.backends.cache\' # 引擎 SESSION_CACHE_ALIAS = \'default\' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
3、文件Session
配置 settings.py SESSION_ENGINE = \'django.contrib.sessions.backends.file\' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
4、缓存+数据库Session
数据库用于做持久化,缓存用于提高效率 配置 settings.py SESSION_ENGINE = \'django.contrib.sessions.backends.cached_db\' # 引擎
5、加密cookie Session
配置 settings.py SESSION_ENGINE = \'django.contrib.sessions.backends.signed_cookies\' # 引擎
6、session自定义验证登录,装饰器
def login(func): def wrap(request, *args, **kwargs): # 如果未登陆,跳转到指定页面 if request.path == \'/index/\': return redirect(\'/login/\') return func(request, *args, **kwargs) return wrap
Django CSRF
一、简介
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
二、应用
1、普通表单
veiw中设置返回值: return render_to_response(\'Account/Login.html\',data,context_instance=RequestContext(request)) 或者 return render(request, \'xxx.html\', data) html中设置Token: {% csrf_token %}
2、ajax
view.py
from django.template.context import RequestContext # Create your views here. def test(request): if request.method == \'POST\': print request.POST return HttpResponse(\'ok\') return render_to_response(\'app01/index.html\',context_instance=RequestContext(request))
index.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> {% csrf_token %} <input type="button" onclick="Do();" value="Do it"/> <script src="/static/plugin/jquery/jquery-1.8.0.js"></script> <script src="/static/plugin/jquery/jquery.cookie.js"></script> <script type="text/javascript"> var csrftoken = $.cookie(\'csrftoken\'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); function Do(){ $.ajax({ url:"/app01/test/", data:{id:1}, type:\'POST\', success:function(data){ console.log(data); } }); } </script> </body> </html>
注:原文出处http://www.cnblogs.com/wupeiqi/articles/5237704.html
以上是关于Django入门全套(第三部)的主要内容,如果未能解决你的问题,请参考以下文章
🤖全套Java教程_Java基础入门教程,零基础小白自学Java必备教程🙋♂️002 # 第三单元 运算符方法入门 #
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化