godaddy如何上传网站,如何建立属于自己的网址,seo站内优化技巧,怎么做一考试网站一 什么是Ajax
AJAX#xff08;Asynchronous Javascript And XML#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互#xff0c;传输的数据为XML#xff08;当然#xff0c;传输的数据不只是XML,现在更多使用json数据#xf…一 什么是Ajax
AJAXAsynchronous Javascript And XML翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互传输的数据为XML当然传输的数据不只是XML,现在更多使用json数据。
同步交互客户端发出一个请求后需要等待服务器响应结束后才能发出第二个请求异步交互客户端发出一个请求后无需等待服务器响应结束就可以发出第二个请求。
AJAX除了异步的特点外还有一个就是浏览器页面局部刷新这一特点给用户的感受是在不知不觉中完成请求和响应过程
场景 优点
AJAX使用Javascript技术向服务器发送异步请求AJAX无须刷新整个页面
二 基于jquery的Ajax实现
button classsend_Ajaxsend_Ajax/button
script$(.send_Ajax).click(function(){$.ajax({url:/handle_Ajax/,type:POST,data:{username:Yuan,password:123},success:function(data){console.log(data)},error: function (jqXHR, textStatus, err) {console.log(arguments);},complete: function (jqXHR, textStatus) {console.log(textStatus);},statusCode: {403: function (jqXHR, textStatus, err) {console.log(arguments);},400: function (jqXHR, textStatus, err) {console.log(arguments);}}})})/scriptAjax—-服务器——Ajax执行流程图 三 案例
一 通过Ajax实现前端输入两个数字服务器做加法返回到前端页面
def test_ajax(requests):n1int(requests.POST.get(n1))n2int(requests.POST.get(n2))return HttpResponse(n1n2)
$(#submit).click(function () {$.ajax({url: /test_ajax/,type: post,data: {n1: $(#num1).val(),n2: $(#num2).val()},success: function (data) {console.log(data)$(#sum).val(data)},})
})
input typetext idnum1input typetext idnum2input typetext idsum
button idsubmit计算/button二 基于Ajax进行登录验证
用户在表单输入用户名与密码通过Ajax提交给服务器服务器验证后返回响应信息客户端通过响应信息确定是否登录成功成功则跳转到首页否则在页面上显示相应的错误信息
def auth(request):back_dic{user:None,message:None}namerequest.POST.get(user)passwordrequest.POST.get(password)print(name)print(password)usermodels.user.objects.filter(namename,passwordpassword).first()print(user)# print(user.query)if user:back_dic[user]user.nameback_dic[message]成功else:back_dic[message]用户名或密码错误import jsonreturn HttpResponse(json.dumps(back_dic))
$(#submit3).click(function () {$.ajax({url: /auth/,type: post,data: {user: $(#id_name).val(),password: $(#id_password).val()},success: function (data) {{#console.log(data)#}var dataJSON.parse(data)if (data.user){location.hrefhttps://www.baidu.com}else {$(.error).html(data.message).css({color:red,margin-left:20px})}}})}
)traditional:true—可以序列化一层列表多层不行要转成json格式上传
四 文件上传
请求头ContentType
1 application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生
表单如果不设置 enctype 属性那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样无关的请求头在本文中都省略掉了
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charsetutf-8userlqzage222 multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时必须让 表单的 enctype 等于 multipart/form-data。直接来看一个请求示例
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary----WebKitFormBoundaryrGKCBY7qhFd3TrwA------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; nameuseryuan
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; namefile; filenamechrome.png
Content-Type: image/pngPNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段为了避免与正文内容重复boundary 很长很复杂。然后 Content-Type 里指明了数据是以 multipart/form-data 来编码本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分每部分都是以 --boundary 开始紧接着是内容描述信息然后是回车最后是字段具体内容文本或二进制。如果传输的是文件还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。关于 multipart/form-data 的详细定义请前往 rfc1867 查看。
这种方式一般用来上传文件各大服务端语言对它也有着良好的支持。
上面提到的这两种 POST 数据的方式都是浏览器原生支持的而且现阶段标准中原生 表单也只支持这两种方式通过 元素的 enctype 属性指定默认为 application/x-www-form-urlencoded。其实 enctype 还支持 text/plain不过用得非常少。
随着越来越多的 Web 站点尤其是 WebApp全部使用 Ajax 进行数据交互之后我们完全可以定义新的数据提交方式给开发带来更多便利。
3 application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上现在越来越多的人把它作为请求头用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify服务端语言也都有处理 JSON 的函数使用 JSON 不会遇上什么麻烦。
JSON 格式支持比键值对复杂得多的结构化数据这一点也很有用。记得我几年前做一个项目时需要提交的数据层次非常深我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val仍然放在键值对里以 x-www-form-urlencoded 方式提交。
基于Form表单上传文件
form action/file_put/ methodpost enctypemultipart/form-data用户名input typetext namename头像input typefile nameavatar idavatar1
input typesubmit value提交
/form必须指定 enctype”multipart/form-data”
视图函数
def file_put(request):if request.methodGET:return render(request,file_put.html)else:# print(request.POST)# print(request.POST)print(request.body) # 原始的请求体数据 print(request.GET) # GET请求数据 print(request.POST) # POST请求数据 print(request.FILES) # 上传的文件数据# print(request.body.decode(utf-8))print(request.body.decode(utf-8))print(request.FILES)file_objrequest.FILES.get(avatar)print(type(file_obj))with open(file_obj.name,wb) as f:for line in file_obj:f.write(line)return HttpResponse(ok)基于Ajax上传文件
$(#ajax_button).click(function () {var formdatanew FormData()formdata.append(name,$(#id_name2).val())formdata.append(avatar,$(#avatar2)[0].files[0])$.ajax({url:,type:post,processData:false, //告诉jQuery不要去处理发送的数据contentType:false,// 告诉jQuery不要去设置Content-Type请求头data:formdata,success:function (data) {console.log(data)}})
})浏览器请求头为
Content-Type:
multipart/form-data; boundary—-WebKitFormBoundaryA5O53SvUXJaF11O2
五 Ajax提交json格式数据
$(#ajax_test).click(function () {var dic{name:lqz,age:18}$.ajax({url:,type:post,contentType:application/json, //一定要指定格式 contentType: application/json;charsetutf-8,data:JSON.stringify(dic), //转换成json字符串格式success:function (data) {console.log(data)}})})提交到服务器的数据都在 request.body 里取出来自行处理
六 Django内置的serializers把对象序列化成json字符串
from django.core import serializers
from django.core import serializers
def test(request):book_list Book.objects.all() ret serializers.serialize(json, book_list)return HttpResponse(ret) Cookie 1 会话跟踪技术
什么是会话跟踪
我们需要先了解一下什么是会话可以把会话理解为客户端与服务器之间的一次会晤在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话你就是客户端而10086服务人员就是服务器了。从双方接通电话那一刻起会话就开始了到某一方挂断电话表示会话结束。在通话过程中你会向10086发出多个请求那么这多个请求都在一个会话中。 在Web中客户向某一服务器发出第一个请求开始会话就开始了直到客户关闭了浏览器会话结束。
在一个会话的多个请求中共享数据这就是会话跟踪技术。例如在一个会话中的请求如下 请求银行主页
请求登录请求参数是用户名和密码请求转账请求参数与转账相关的数据请求信誉卡还款请求参数与还款相关的数据。
在这上会话中当前用户信息必须在这个会话中共享的因为登录的是张三那么在转账和还款时一定是相对张三的转账和还款这就说明我们必须在一个会话过程中有共享数据的能力。
会话路径技术使用Cookie或session完成
我们知道HTTP协议是无状态协议也就是说每个请求都是独立的无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪在Web开发中使用session来完成会话跟踪session底层依赖Cookie技术。
2 cookie介绍
cookie的由来
大家都知道HTTP协议是无状态的
无状态的意思是每次请求都是独立的它的执行情况和结果与前面的请求和之后的请求都无直接关系它不会受前面的请求响应情况直接影响也不会直接影响后面的请求响应情况。
一句有意思的话来描述就是人生只如初见对服务器来说每次的请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。
什么是cookie
其实Cookie是key-value结构类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建然后通过响应发送给客户端的一个键值对。客户端会保存Cookie并会标注出Cookie的来源哪个服务器的Cookie。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器这样服务器就可以识别客户端了
cookie的原理
cookie的工作原理是由服务器产生内容浏览器收到请求后保存在本地当浏览器再次访问时浏览器会自动带上Cookie这样服务器就能通过Cookie的内容来判断这个是“谁”了。
Cookie规范
Cookie大小上限为4KB一个服务器最多在客户端浏览器上保存20个Cookie一个浏览器最多保存300个Cookie
上面的数据只是HTTP的Cookie规范但在浏览器大战的今天一些浏览器为了打败对手为了展现自己的能力起见可能对Cookie规范“扩展”了一些例如每个Cookie的大小为8KB最多可保存500个Cookie等但也不会出现把你硬盘占满的可能 注意不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时服务器会把Cookie发给IE然后由IE保存起来当你在使用FireFox访问服务器时不可能把IE保存的Cookie发送给服务器。
Cookie的覆盖
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie例如客户端的第一个请求服务器端发送的Cookie是Set-Cookie: aA第二请求服务器端发送的是Set-Cookie: aAA那么客户端只留下一个Cookie即aAA。
在浏览器中查看cookie
浏览器中按F12点network—cookies就能看到
Django中操作Cookie
获取Cookie
request.COOKIES[key]
request.get_signed_cookie(key, defaultRAISE_ERROR, salt, max_ageNone)参数
default: 默认值salt: 加密盐max_age: 后台控制过期时间
设置Cookie
rep HttpResponse(...)
rep render(request, ...)rep.set_cookie(key,value)
rep.set_signed_cookie(key,value,salt加密盐)参数
key, 键value’’, 值max_ageNone, 超时时间 cookie需要延续的时间以秒为单位如果参数是\ None 这个cookie会延续到浏览器关闭为止expiresNone, 超时时间(IE requires expires, so set it if hasn’t been already.)path’/‘, Cookie生效的路径/ 表示根路径特殊的根路径的cookie可以被任何url的页面访问浏览器只会把cookie回传给带有该路径的页面这样可以避免将cookie传给站点中的其他的应用。domainNone, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如 domain”.example.com”所构造的cookie对下面这些站点都是可读的www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None cookie只能由设置它的站点读取secureFalse, 浏览器将通过HTTPS来回传cookiehttponlyFalse 只能http协议传输无法被JavaScript获取不是绝对底层抓包可以获取到也可以被覆盖
删除Cookie
def logout(request):rep redirect(/login/)rep.delete_cookie(user) # 删除用户浏览器上之前设置的usercookie值return repCookie版登录校验
def login_auth(func):def inner(request,*args,**kwargs):next_urlrequest.get_full_path()if request.COOKIES.get(is_login):return func(request,*args,**kwargs)else:return redirect(cookie_login/?next%s%next_url)return inner
login_auth
def cookie_order(request):return HttpResponse(我是订单页面)
login_auth
def cookie_index(request):namerequest.COOKIES.get(username)return render(request,cookie_index.html,{name:name})
def cookie_login(request):if request.method POST:next_urlrequest.GET.get(next)namerequest.POST.get(name)passwordrequest.POST.get(password)if name lqz and password 123:import datetimenowdatetime.datetime.now().strftime(%Y-%m-%d %X)print(now)objredirect(next_url)obj.set_cookie(is_login,True)obj.set_cookie(username,name)obj.set_cookie(login_time,now)return objreturn render(request, cookie_login.html)Session
Session的由来
Cookie虽然在一定程度上解决了“保持状态”的需求但是由于Cookie本身最大支持4096字节以及Cookie本身保存在客户端可能被拦截或窃取因此就需要有一种新的东西它能支持更多的字节并且他保存在服务器有较高的安全性。这就是Session。
问题来了基于HTTP协议的无状态特征服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。
我们可以给每个客户端的Cookie分配一个唯一的id这样用户在访问时通过Cookie服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id在服务器上保存一段时间的私密资料如“账号密码”等等。
总结而言Cookie弥补了HTTP无状态的不足让服务器知道来的人是“谁”但是Cookie以文本的形式保存在本地自身安全性较差所以我们就通过Cookie识别不同的用户对应的在Session里保存私密的信息以及超过4096字节的文本。
另外上述所说的Cookie和Session其实是共通性的东西不限于语言和框架。 Django中Session相关方法
# 获取、设置、删除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的key
request.session.session_key# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()# 检查会话session的key在数据库中是否存在
request.session.exists(session_key)# 删除当前会话的所有Session数据(只删数据库)
request.session.delete()# 删除当前的会话数据并删除会话的Cookie数据库和cookie都删。
request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问例如django.contrib.auth.logout() 函数中就会调用它。# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)* 如果value是个整数session会在些秒数后失效。* 如果value是个datatime或timedeltasession就会在这个时间后失效。* 如果value是0,用户关闭浏览器session就会失效。* 如果value是None,session会依赖全局session失效策略。Django中使用session时做的事
# 生成随机字符串
# 写浏览器cookie - session_id: 随机字符串
# 写到服务端session# {# 随机字符串: {user:lqz}# }Django中的Session配置
1. 数据库Session
SESSION_ENGINE django.contrib.sessions.backends.db # 引擎默认2. 缓存Session
SESSION_ENGINE django.contrib.sessions.backends.cache # 引擎
SESSION_CACHE_ALIAS default # 使用的缓存别名默认内存缓存也可以是memcache此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE django.contrib.sessions.backends.file # 引擎
SESSION_FILE_PATH None # 缓存文件路径如果为None则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存数据库
SESSION_ENGINE django.contrib.sessions.backends.cached_db # 引擎5. 加密Cookie Session
SESSION_ENGINE django.contrib.sessions.backends.signed_cookies # 引擎其他公用设置项
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默认修改之后才保存默认思考如果第二个人再次再同一个浏览器上登录django-session表会怎样
CBV中加装饰器
from django import views
from django.utils.decorators import method_decorator
# method_decorator(login_auth,nameget)
# method_decorator(login_auth,namepost)
class UserList(views.View):# method_decorator(login_auth)def dispatch(self, request, *args, **kwargs):objsuper().dispatch(request, *args, **kwargs)return objmethod_decorator(login_auth)def get(self,request):return HttpResponse(我是用户列表)def post(self,request):return HttpResponse(我是用户列表)