bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Django框架從入門到應用

一. 初識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:

編輯班級信息

班級名稱:

{# #}

網頁名稱:Django框架從入門到應用
分享路徑:http://vcdvsql.cn/article34/iijppe.html

成都網站建設公司_創新互聯,為您提供自適應網站網站策劃外貿網站建設網站內鏈虛擬主機網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管