一css
json的定義:html
json(JavaScript object notation,js對象標記)是一種輕量級的數據交換格式,它基於ecmascript(w3c指定的js規範)的一個子集,採用徹底獨立於編程語言的文本格式來存儲和表示數據.mysql
簡介和清晰的層次結構使得json成爲理想的數據交換語言,易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提高網絡傳輸效率jquery
咱們的json就是序列化用的,基於咱們的網絡傳輸的數據都是字符串,咱們須要把全部的數據類型轉換成字符串才能夠進行傳輸,那麼咱們的json就是這樣一個功能,它負責把全部的數據類型轉換成字符串,而後進行傳輸,一邊把數據打包成字符串傳過去,對方接受以後把這些字符串再經過解包還原成他們原來的樣子,web
咱們的json打包後的字符串是有固定格式的,若是咱們的字符串知足這個格式的話,就不須要再打包了,直接使用咱們的json解包便可獲得該數據本來的樣子.ajax
那麼咱們的json字符串的固定格式是什麼樣子的呢?sql
Python 的序列化和反序列化數據庫
序列化 json.dumps(d) d 裏面不須要知足都是雙引號 數字 字符串 列表 字典 布爾值 None import json # d1= {'name':'alex'} # d2 ={"name":"alex"} # print(json.dumps(d1)) # print(json.dumps(d2)) # 外部的字符串符號省略 # {"name": "alex"} # {"name": "alex"} # 反序列化 json.loads(s) s裏面必須知足都是雙引號 由於序列化出來的內部都是雙引號 # s1= "{'name':'alex'}" # s2 ='{"name":"alex"}' # print(json.loads(s1),type(json.loads(s1))) # 報錯了 由於序列化出來的是內部字典內部是雙引號 此時s1內部是單引號 不符合序列化的標準 # print(json.loads(s2),type(json.loads(s2))) # {'name': 'alex'} <class 'dict'> # b1 = None # print(json.dumps(b1)) # null # b2 = 'null' # b3 = "null" # print(json.loads(b2)) # print(json.loads(b3)) # 都行能夠的
js序列化和反序列化django
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script src="/static/js/jquery-3.2.1.min.js"></script> <script> {# var d1={'name':'alex'}#} {# var d2={"name":"wusir"}#} {# var d11=JSON.stringify(d1)#} {# var d22=JSON.stringify(d2)#} {# console.log(d11)#} {# console.log(d22)#} 序列化 {#{"name":"alex"}#} {#{"name":"wusir"}#} 反序列化 {#var s1="{'name':'alex'}";#} {#var s2='{"name":"wusir"}';#} {#var s11=JSON.parse("{'name':'alex'}")#} var s22=JSON.parse('{"name":"wusir"}') {#console.log(s11)#} 格式不對 報錯 console.log(s22) 正常 </script> </body> </html>
ajax定義:編程
AJAX(Asynchronous Javascript And XML)
翻譯成中文就是'異步JavaScript和XML',也就是使用JavaScript語言與服務器進行異步交互,傳輸的數據爲XML(不單單侷限於XML),咱們的ajax是基於咱們的js語言來實現的功能.
咱們的web請求,分爲如下三種:
地址欄 url 直接輸入地址便可獲得相應的頁面 get請求
超連接標籤 get請求
form表單 get/post請求
ajax get/post請求
局部刷新:(在不刷新本頁面的狀況,對局部的某個標籤進行處理)
咱們舉例來理解這的概念,在咱們的其餘的網站的登陸註冊頁面裏面,咱們的用戶名,密碼,郵箱等信息不能爲空的,可是咱們若是爲空,而後點擊註冊按鈕的時候,input框周邊會彈出提示信息,提示咱們的輸入不能爲空,這個時候咱們的點擊事件並無刷新咱們的頁面,可是咱們確實真的刷新了,由於彈出的提示信息咱們的輸入的用戶名已經存在,這很顯然是咱們的數據已經去到數據庫裏面過了一遍,這就是刷新的證據}咱們在不少的朋友圈或者是微博裏面或者是博客裏面的時候,有點贊功能,咱們的頁面不會整個全局刷新,咱們點擊一下那個點讚的按鈕以後看到有數據提交返回給瀏覽器,可是頁面沒有刷新都是由於咱們的ajax在中間起到的做用
異步請求(同時作幾件事情)
客戶端發出一個請求後,無需等待服務器相應結束就能夠發出第二個請求操做
咱們在註冊頁面的時候裏面有不少的input框,咱們在輸入的時候一個框輸入完以後就緊接着輸入第二個框,在這個過程當中one by one,頁面都不會刷新,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ajax練習</title> {# 引用css link 連接#} <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/css/bootstrap.min.css"> </head> <body> {#實例一html#} <button class="s1">send_ajax</button> <span>我是index頁面</span> <p class="name"></p> {#實例二html#} <input type="text" id="n1">+<input type="text" id="n2">=<input type="text" id="n3"><button class="sum">計算</button> {#實例三html#} {#這裏設置下邊ajaxd的data 要從這裏取值的必xe#} {% csrf_token %} <h4>用戶登陸校驗</h4> <div>用戶名:<input type="text" id="user"><span id="err"></span></div> {#在線引用jQuery cdn#} {#<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script>#} {#本地引用js#} <script src="/static/js/jquery-3.2.1.min.js"></script> {#ajax 經過另外一個視圖函數返回的數據#} <script> {#簡單的實例一 text 取值#} $(".s1").click(function () { $.ajax({ url: "/ajax_handle/", type: "get", success: function (data) { console.log(data); {#經過另個視圖函數返回值給本頁面的數據#} $(".name").text(data) } }) }); {#實例二求和注意一下 標籤之間的內容text取值能夠是.text()或者是.html() 可是若是是標籤的value的話就是.val()#} $(".sum").click(function () { $.ajax({ url:"/ajax_sum/", data:{'num1':$("#n1").val(),'num2':$("#n2").val()}, success:function (data) { console.log(data); $("#n3").val(data) } }) }); {#實例三傳參數若是是post 的時候data的字典中必須配置中間件的鍵值對 注意中間件的是個val()}#} {# 序列化 JSON.stringify()#} {# 反序列化 JSON.parse()#} $('#user').blur(function () { $.ajax({ url:"/jiaoyan_user/", type:'post', {#針對post請求 不註釋csrftoken ,必須有個鍵值對 中間件:中間件的值#} data:{'user':$('#user').val(), 'csrfmiddlewaretoken':$("[name='csrfmiddlewaretoken']").val()}, {#data:{"user":$("#user").val(),#} {# "csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val()},#} success:function (data) { var data1=JSON.parse(data); console.log(data1); if(data1.is_reg) { $('#err').html('用戶名已註冊').css('color',"red"); {#$("#user").next().html("該用戶已經註冊").css("color","red")#} } } }) }) </script> </body> </html>
def ajax_handle(request): return HttpResponse('王巖羅丹') def ajax_sum(request): #如下取值是按照前面的data 鍵值對取值 num1 = request.GET.get("num1") num2 = request.GET.get("num2") ret = int(num1)+int(num2) return HttpResponse(str(ret)) #只能返回字符串
驗證登陸的實例url
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index), url(r'^ajax_yanzheng/',views.ajax_yanzheng), ]
驗證登陸的html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>登錄成功</h1> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陸</title> </head> <form action="" method="post"> {% csrf_token %} 用戶名:<input type="text"name="user" id="user1"> 密碼:<input type="password"name="pwd"id="pwd1"> <input type="button"value="登陸" class="button" ><span class="err"></span> </form> <body> {#<script src="/static/js/jquery-3.2.1.min.js"></script>#} <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script> <script> $(function () { $(".button").click(function () { {#排錯 第一步此時找相對應的 標籤的id 或者是class#} var name = $('#user1').val(); var pwd= $('#pwd1').val(); var midd = $('[name="csrfmiddlewaretoken"]').val(); console.log(name,pwd) $.ajax({ url:"/ajax_yanzheng/", type:"POST", {#排錯第二步找第一步var name pwd#} data:{ "user": name, "pwd": pwd, "csrfmiddlewaretoken": midd }, success:function (data) { console.log(data); var data1= JSON.parse(data); {#data1 反序列化是個對象#} console.log(data1); if (data1.name_pwd){ location.href='/index/' }else { $(".err").text('用戶名或者密碼錯誤').css('color','red') } } }) }) }); </script> </body> </html>
驗證登陸的views
from django.shortcuts import render,HttpResponse from app01 import models import json # Create your views here. def login(request): return render(request,'login.html') def ajax_yanzheng(request): res = {'name_pwd': True} usera = request.POST.get('user') #排錯第三步找第二步data pwda = request.POST.get('pwd') #排錯第三步找第二步data # print(usera,pwda) ret = models.User.objects.filter(name=usera, pwd=pwda).first() # 若是是 ret = models.User.objects.filter(name=usera, pwd=pwda) 沒有就是空列表也是同樣的 # print(ret) # print("*"*100) if ret: pass else: res['name_pwd'] = False return HttpResponse(json.dumps(res)) def index(request): return render(request,'index.html')
驗證登陸的settings
""" Django settings for denglu project. Generated by 'django-admin startproject' using Django 1.11.9. For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'su7%!ibpt_(5dl6#it*p+_uv7yqd9nin12!ynsww1t)ac_ffa_' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', #這裏注意後建的幾個app 這裏在這裏設置 ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'denglu.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'denglu.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases # DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER': "root", 'NAME':"denglu", 'PASSWORD': "123456", 'PORT': "3306 ", 'HOST': "127.0.0.1", } } # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIR = [ os.path.join(BASE_DIR, "static") ]