中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django框架從入門到應用

發布時間:2020-07-08 22:30:48 來源:網絡 閱讀:263 作者:nineteens 欄目:編程語言

  一. 初識web框架

  1. http協議

  http協議是無狀態,短連接的。客戶端連接服務器,發送請求,服務器響應請求后斷開連接。

  2. socket簡介

  所有的網絡請求都是基于socket,瀏覽器是socket客戶端,網站是socket服務端。

  3. socket服務端概述

  根據url的不同返回給用戶不同的內容,使用路由系統,路由系統是url與函數的對應關系。返回給用戶的內容本質是字符串,基本上返回的內容是動態的,所以需要使用到模板渲染。模板渲染實際上是把html充當模板,自己創造任意數據替換模板中的特殊字符,比如替換特殊字符為數據庫中的數據。

  4. 自己寫web框架

  靜態應用

  # coding:utf-8

  import socket

  def f1(request):

  '''

  處理用戶請求,并返回相應的內容

  :param request:用戶請求的所有信息

  :return:返回相應的內容

  '''

  return b'f1'

  def f2(request):

  '''

  處理用戶請求,并返回相應的內容

  :param request:

  :return:

  '''

  f = open('index.html', 'rb')

  data = f.read()

  f.close()

  return data

  def f3(request):

  '''

  處理用戶請求,并返回相應的內容

  :param request:

  :return:

  '''

  f = open('news.html', 'rb')

  data = f.read()

  f.close()

  return data

  routers = [

  ('/user', f1),

  ('/', f2)

  ]

  def run():

  sock = socket.socket()

  sock.bind(('127.0.0.1', 8080))

  sock.listen(5)

  while True:

  conn, addr = sock.accept()

  '''

  有用戶來連接,

  獲取用戶發送的數據

  '''

  data = conn.recv(8096)

  print(data)

  '''請求頭:

  GET / HTTP/1.1

  Host: 127.0.0.1:8080

  Connection: keep-alive

  Upgrade-Insecure-Requests: 1\

  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36

  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

  Purpose: prefetch

  Accept-Encoding: gzip, deflate,

  Accept-Language: zh-CN,zh;q=0.9

  '''

  # 解析請求頭,目標:獲取請求頭中的url,并根據url向服務端發送請求

  data = str(data, encoding='utf-8')

  headers, bodys = data.split('\r\n\r\n')

  headers_list = headers.split('\r\n')

  methods, url, protocal = headers_list[0].split(' ')

  func_name = None

  for item in routers:

  if item[0] == url:

  func_name = item[1]

  break

  if func_name:

  response = func_name(data)

  else:

  response = '404'

  # if url == '/user':

  # conn.send(b'user page')

  # else:

  # conn.send(b'404 is not found!')

  # conn.send(b"HTTP/1.1 200 OK\r\n\r\n") # 響應頭

  # conn.send(b"hello thanlon!") # 相應體

  conn.close()

  if __name__ == '__main__':

  run()

  動態應用示例一

  # coding:utf-8

  import socket

  def f1(request):

  '''

  處理用戶請求,并動態返回相應的內容

  :param request:

  :return:

  '''

  f = open('news.html', 'r', encoding='utf-8')

  data = f.read()

  f.close()

  import time

  ctime = time.time()

  data = data.replace('%', str(ctime))

  return bytes(data, encoding='utf-8')

  routers = [

  ('/user', f1),

  ]

  def run():

  sock = socket.socket()

  sock.bind(('127.0.0.1', 8080))

  sock.listen(5)

  while True:

  conn, addr = sock.accept()

  '''

  有用戶來連接,

  獲取用戶發送的數據

  '''

  data = conn.recv(8096)

  print(data)

  '''請求頭:

  GET / HTTP/1.1

  Host: 127.0.0.1:8080

  Connection: keep-alive

  Upgrade-Insecure-Requests: 1\

  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36

  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

  Purpose: prefetch

  Accept-Encoding: gzip, deflate,

  Accept-Language: zh-CN,zh;q=0.9

  '''

  # 解析請求頭,目標:獲取請求頭中的url,并根據url向服務端發送請求

  data = str(data, encoding='utf-8')

  headers, bodys = data.split('\r\n\r\n')

  headers_list = headers.split('\r\n')

  methods, url, protocal = headers_list[0].split(' ')

  func_name = None

  for item in routers:

  if item[0] == url:

  func_name = item[1]

  break

  if func_name:

  response = func_name(data)

  else:

  response = '404'

  # if url == '/user':

  # conn.send(b'user page')

  # else:

  # conn.send(b'404 is not found!')

  # conn.send(b"HTTP/1.1 200 OK\r\n\r\n") # 響應頭

  # conn.send(b"hello thanlon!") # 相應體

  conn.close()

  if __name__ == '__main__':

  run()

  動態應用示例二

  # coding:utf-8

  import socket

  def f1(request):

  import pymysql

  # 創建連接

  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='wwwnxl', db='test')

  # 創建游標

  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

  # 執行sql語句,并返回受影響的行數

  cursor.execute("select id,name,passwd from userinfo")

  user_list = cursor.fetchall()

  cursor.close()

  conn.close()

  # print(user_list)

  content_list = []

  for row in user_list:

  tp = '%s%s%s' % (row['id'], row['name'], row['passwd'],)

  content_list.append(tp)

  content = ''.join(content_list)

  f = open('userlist.html', 'r', encoding='utf-8')

  template = f.read()

  f.close()

  data = template.replace('{{content}}', content)

  print(data)

  return bytes(data, encoding='utf-8')

  routers = [

  ('/user', f1),

  ]

  def run():

  sock = socket.socket()

  sock.bind(('127.0.0.1', 8080))

  sock.listen(5)

  while True:

  conn, addr = sock.accept()

  '''

  有用戶來連接,

  獲取用戶發送的數據

  '''

  data = conn.recv(8096)

  # print(data)

  '''請求頭:

  GET / HTTP/1.1

  Host: 127.0.0.1:8080

  Connection: keep-alive

  Upgrade-Insecure-Requests: 1\

  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36

  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

  Purpose: prefetch

  Accept-Encoding: gzip, deflate,

  Accept-Language: zh-CN,zh;q=0.9

  '''

  # 解析請求頭,目標:獲取請求頭中的url,并根據url向服務端發送請求

  data = str(data, encoding='utf-8')

  headers, bodys = data.split('\r\n\r\n')

  headers_list = headers.split('\r\n')

  methods, url, protocal = headers_list[0].split(' ')

  func_name = None

  for item in routers:

  if item[0] == url:

  func_name = item[1]

  break

  if func_name:

  response = func_name(data)

  else:

  response = b'404'

  conn.send(response)

  conn.close()

  if __name__ == '__main__':

  run()

  5. web框架的分類

  為了方便開發者開發web應用,web框架應用而生。有的web框架幫助開發者構建好了socket服務端,有的web框架幫助開發者寫好了模板渲染。總之,借助web框架可以減輕了開發者的工作量。flask框架只有路由系統,沒有socket服務端和模板引擎,socket服務端使用是python第三方模塊,如wsgiref。模板引擎使用的也是第三方模塊jinjia2。django框架有路由系統、模板引擎,但是沒有socket服務端,socket服務端使用的是python的第三方內置模塊wsgiref,wsgiref把請求交給django做處理。另外,還有一種叫Tornado的框架,Tornado框架包含socket服務端、路由系統、模板引擎。可以將web框架這樣分類,django框架和其它框架。因為django框架提供了很多特殊的功能,如緩存、分布式。其它框架是輕量級的web框架。

  二. 初識django

  安裝django:pip3 install django

  創建django程序:django-admin startproject 項目名稱

  運行django程序:python manager.py runserver 127.0.0.1:8080(如果不指定,默認運行在8000端口)

  三. django程序目錄

  manager.py:對當前django程序所有操作可以基于python manager.py runserver

  settings.py:django配置文件

  url.py:路由系統,url->函數

  wsgi.py:用于定義django使用什么socket服務端,如wsgiref,uwsgi(wsgiref性能比較低)

  四. 第一個django請求

  usr.py:

  from django.shortcuts import HttpResponse

  # 處理請求的函數

  def login(request): #

  '''

  處理用戶請求,返回相響應結果

  :param request:用戶請求的相關信息(不是字節,是對象)

  :return:

  '''

  pass

  return HttpResponse('login!')

  # url

  urlpatterns = [

  # path('admin/', admin.site.urls),

  path('login/', login),

  ]

  四. 靜態文件以及模板的配置

  1. 靜態文件路徑的配置

  創建靜態文件目錄也需要配置:

  

Django框架從入門到應用


  修改settings.py:

  # Static files (CSS, JavaScript, Images)

  # https://docs.djangoproject.com/en/2.2/howto/static-files/

  '''

  只要是使用/static/的前綴,就在這個目錄(static目錄)下找靜態文件

  '''

  STATIC_URL = '/static/'

  STATICFILES_DIRS = (

  os.path.join(BASE_DIR, 'static'),

  )

  2. HttpResponse與render函數

  返回字符串

  return HttpResponse(‘login!’)

  return HttpResponse(’< input type=“text”>’)

  返回模板

  render函數默認是在“templates”中自動找文件,讀取文件內容后返回給用戶。

  return render(request, ‘xxx.html’)

  render函數本質上是調用HttpResponse。

  3. 模板路徑的配置

  模板名稱需要與配置文件設定的模板名字一致,

  

Django框架從入門到應用


  五. 創建程序步驟

  1. 創建project

  django-admin startproject project名,也可以在pycharm中選擇Django,創建project

  2. 配置模板路徑

  創建templates目錄,然后修改配置文件:

  TEMPLATES = [

  {

  'BACKEND': 'django.template.backends.django.DjangoTemplates',

  'DIRS': [os.path.join(BASE_DIR, 'templates')]#BASE_DIR指當前路徑

  ,

  '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',

  ],

  },

  },

  ]

  3. 配置靜態文件目錄

  創建static目錄,然后修改配置文件:

  '''

  只要是使用/static/的前綴,就在這個目錄下找靜態文件

  '''

  STATIC_URL = '/static/'

  STATICFILES_DIRS = (

  os.path.join(BASE_DIR, 'static'),

  )

  4. 額外配置

  將 django.middleware.csrf.CsrfViewMiddleware注釋掉:

  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',

  ]

  六. 用戶登錄示例

  urls.py:

  from django.contrib import admin

  from django.urls import path

  from django.shortcuts import HttpResponse, render, redirect

  def login(request): #

  '''

  處理用戶請求,返回相響應結果

  :param request:用戶請求的相關信息(不是字節,是對象)

  :return:

  '''

  if request.method == 'GET':

  return render(request, 'login.html') # 本質上是調用HttpResponse,自動找到login.html文件,讀取內容并返回給用戶

  else:

  # print(request.POST) # 用戶POST提交的數據(請求體)

  # user = request.POST['username']#直接索引,如果沒有username會報錯

  username = request.POST.get('username') # 如果沒有username不會報錯,返回None

  pwd = request.POST.get('pwd') # 如果沒有username不會報錯,返回None

  if username == 'thanlon' and pwd == '123456':

  return redirect('https://www.blueflags.cn')

  else:

  return render(request, 'login.html', {'msg': '用戶名或密碼錯誤!'}) # django內部做模板渲染

  urlpatterns = [

  # path('admin/', admin.site.urls),

  path('login/', login),

  ]

  login.html:

  用戶名

  密碼

  {{ msg }}

  登錄

  登錄效果:

  七. request.GET與 request.POST

  1. request.GET

  request.GET是從請求頭的url中獲取值

  2. request.POST

  request.POST是從請求體中獲取值。GET請求時,只有request.GET可以獲取值。但POST請求時,request.POST和request.GET都可能獲取值。

  ……

  可以通過request.GET獲取url中的page

  八. django模板語言特殊標記(重點內容)

  1. 取字符串的值

  def index(request):

  return render(request, 'index/index.html', {'username': '一問奈何'})

  {{ username }}

  # 一問奈何

  2. 取列表的值

  def index(request):

  # return render(request, 'index/index.html', {'username': '一問奈何'})

  return render(request, 'index/index.html', {'username': ['thanlon','Kiku']})

  直接通過索引

  {#

  {{ username }}

  #}

  {{ username }}

  {{ username.0 }}

  {{ username.1 }}

  通過循環遍歷

  {% for item in username %}

  {{ item }}

  {% endfor %}

  

Django框架從入門到應用


  3. 取字典的值

  def index(request):

  return render(request, 'index/index.html', {

  'user_dict': {'name': '一問奈何', 'age': 23}

  })

  {{ user_dict.name }}

  {{ user_dict.age }}

  4. 取嵌套于列表中字典的值

  def index(request):

  return render(request, 'index/index.html', {

  'user_list_dict': [

  {'id': 1, 'name': 'thanlon'},

  {'id': 2, 'name': 'kuku'},

  ]

  })

  通過索引取值

  {{ user_list_dict.0.id}}--{{ user_list_dict.0.name}}

  {{ user_list_dict.1.id}}--{{ user_list_dict.0.name}}

  通過循環取值

  {% for row in user_list_dict %}

  {{ row.id }}--{{ row.name }}

  {% endfor %}

  

Django框架從入門到應用


  九. 學生信息管理系統-數據庫表的結構設計

  mysql> create table class

  -> (

  -> id int auto_increment primary key,

  -> title varchar(20) not null

  -> );

  mysql> create table student

  -> (

  -> id int auto_increment primary key,

  -> name varchar(10) not null,

  -> class_id int not null

  -> );

  mysql> create table teacher

  -> (

  -> id int auto_increment primary key,

  -> name varchar(10) not null

  -> );

  mysql> create table teacher2class

  -> (

  -> id int primary key,

  -> teacher_id int not null,

  -> class_id int not null

  -> );

  十. 學生信息管理系統-查詢班級信息列表與添加班級信息

  1. 向班級表中添加數據

  mysql> insert class values(null,'軟件工程'),(null,'計算機科學與技術');

  2. 查詢班級信息

  新建文件夾app01,并在文件夾中新建views.py

  

Django框架從入門到應用


  配置路徑,修改urls.py

  from django.contrib import admin

  from django.urls import path

  from app01 import views

  urlpatterns = [

  path('admin/', admin.site.urls),

  path('classes/', views.classes),

  ]

  在views.py的classes函數(路徑對應此函數)中寫查詢班級信息的邏輯代碼

  from django.shortcuts import render, redirect

  import pymysql

  def classes(request):

  '''

  查詢班級id、班級名稱

  :param request:對象相關的數據

  :return:渲染后的模板

  '''

  # 創建連接

  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='wwwnxl', db='test')

  # 創建游標

  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

  # 執行sql語句

  cursor.execute("select id,title from class")

  classes_list = cursor.fetchall()

  cursor.close()

  conn.close()

  return render(request, 'classes.html', {'classes_list': classes_list})

  在templates文件夾下新建classes.html

  添加無錫×××醫院 http://www.bhnkyixue.com/

  {% for row in classes_list %}

  {{ row.id }}

  {{ row.title }}

  {% endfor %}

  運行程序后,訪問http://127.0.0.1:8000/classes/可以查看到頁面效果:

  

Django框架從入門到應用


  3. 添加班級信息

  配置路徑,修改urls.py

  from django.contrib import admin

  from django.urls import path

  from app01 import views

  urlpatterns = [

  path('admin/', admin.site.urls),

  path('classes/', views.classes),

  path('add-class/', views.add_class),

  ]

  在templates文件夾下新建add_class.html

  添加班級

  班級名稱:

  

Django框架從入門到應用


  在views.py的add_class函數中寫添加學生班級信息的邏輯代碼

  def add_class(request):

  if request.method == 'GET':

  return render(request, 'add_class.html')

  else:

  class_title = request.POST.get('class_title')

  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='wwwnxl', db='test')

  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

  # cursor.execute("insert into class(title) values(%s)", [class_title, ])

  cursor.execute('insert into class(title) values(%s)', class_title)

  conn.commit()

  cursor.close()

  conn.close()

  return redirect('/classes/')

  程序正常運行后,在班級信息頁面(http://127.0.0.1:8000/classes/)中點擊添加按鈕,進入添加班級信息界面(http://127.0.0.1:8000/add-class/)。提交添加的班級信息后,自動跳轉到班級信息頁面。

  十. 學生信息管理系統-刪除班級信息

  view.py

  def del_class(request):

  nid = request.GET.get('nid')

  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='wwwnxl', db='test')

  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

  # cursor.execute("insert into class(title) values(%s)", [class_title, ])

  cursor.execute('delete from class where id=%s', nid)

  conn.commit()

  cursor.close()

  conn.close()

  return redirect('/classes/')

  瀏覽器向服務端發送刪除數據的請求,服務端接收請求刪除數據后向瀏覽器發送響應,告訴瀏覽器重定向到/classes/。服務端向瀏覽器發送響應的響應頭中有location:http://127.0.0.1:8000/classes/,即是:告訴瀏覽器向此鏈接發送一次請求。

  十一. 學生信息管理系統-編輯班級信息

  view.py:

  def edit_class(request):

  if request.method == 'GET':

  nid = request.GET.get('nid')

  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='wwwnxl', db='test')

  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

  cursor.execute('select id,title from class where id=%s', nid)

  result = cursor.fetchone()

  cursor.close()

  conn.close()

  return render(request, 'edit_class.html', {'result': result})

  else:

  # nid = request.POST.get('nid') # 放到請求體

  nid = request.GET.get('nid') # 放到請求頭

  title = request.POST.get('title')

  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='wwwnxl', db='test')

  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

  cursor.execute('update class set title=%s where id = %s', [title, nid])

  conn.commit()

  cursor.close()

  conn.close()

  return redirect('/classes/')

  edit_class.html:

  編輯班級信息

  班級名稱:

  {# #}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

托克托县| 沭阳县| 白城市| 万山特区| 疏附县| 千阳县| 拉萨市| 威海市| 侯马市| 自治县| 峡江县| 泾阳县| 托克逊县| 德安县| 北碚区| 墨玉县| 晋州市| 宿松县| 厦门市| 丰都县| 双柏县| 福贡县| 班戈县| 万山特区| 丽江市| 千阳县| 儋州市| 诸城市| 霞浦县| 乾安县| 阿图什市| 绵竹市| 鹰潭市| 大埔区| 白水县| 洛阳市| 隆尧县| 澄江县| 五台县| 衡南县| 安西县|