【Python之路Day17】Python Web框架之 Django
Django 基礎篇
一、django簡介
Django是一個開放源代碼的Web應用框架,由Python寫成。采用了MVC的軟件設計模式,即模型M,視圖V和控制器C。它最初是被開發來用于管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟件。并于2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。
Django是一個基于MVC構造的框架。但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 里更關注的是模型(Model)、模板(Template)和視圖(Views),稱為 MTV模式。它們各自的職責如下:
模型(Model),即數據存取層
處理與數據相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及數據之間的關系等。
模板(Template),即表現層
處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。
視圖(View),即業務邏輯層
存取模型及調取恰當模板的相關邏輯。模型與模板之間的橋梁。
?
django基本結構:
myiste # 總程序名UserManageSys # 用戶APPmigrations # 數據庫文件夾0001——initial.py # 數據庫__init__.py__init__.pyadmin.py # 后臺,可以用很少量的代碼就擁有一個強大的后臺。 apps.pymodels.py # 與數據庫操作相關,存入或讀取數據時用到這個 tests.pyviews.py # 處理用戶發出的請求,從urls.py中對應過來, 通過渲染templates中的網頁可以將顯示內容比如登陸后的用戶名,用戶請求的數據,輸出到網頁。 mysite # 配置文件__init__.pysettings.py # Django 的設置,配置文件,比如 DEBUG 的開關,靜態文件的位置等urls.py # 網址入口,關聯到對應的views.py中的一個函數(或者generic類),訪問網址就對應一個函數。wsgi.py # wsgi有多重一種uwsgi和wsgi,你用那種wsgi來運行Django, 一般不用改只有你用到的時候在改static # 一些js,css,images.靜態文件夾assets # 第三方插件等css # 樣式images # 存放圖片js # javaScripytemplates # templates中的Html模板,add_user.html # 添加用戶base.html # 基礎模板del_user.html # 刪除用戶index.html # 主頁login.html # 登錄頁面register.html # 注冊頁面db.sqlite3 # 數據庫manage.py # 啟動整個項目文件readme # 幫助文檔 View Code二、安裝django
1.window上使用pip安裝 pip install django 2.linux下使用pip安裝yum install python-pippip install django 3.檢查是否安裝成功 >>> import django >>> django.VERSION三、django基本命令
1.創建django命令 django-admin.py startproject mysite(程序名) 2.創建django的app python manage.py startapp cmdb(app的名字) 或 django-admin.py startapp cmdb(app的名字) 3.同步數據庫 python manage.py syncdb 注意:Django 1.7.1及以上的版本需要用以下命令 python manage.py makemigrations python manage.py migrate 4.調試模式 python manage.py runserver 8001 # 監聽所有可用 ip (電腦可能有一個或多個內網ip,一個或多個外網ip,即有多個ip地址) python manage.py runserver 0.0.0.0:8000 5.清除數據庫 python manage.py flush 6.創建超級管理員 python manage.py createsuperuser 按照提示就ok 7.修改管理員密碼 python manage.py changepassword username(你當時設定的用戶名) 8.導入和導出數據 python manage.py dumpdata appname > appname.json python manage.py loaddata appname.json 9.進入數據庫 python manage.py dbshell 10.更多命令 python manage.py四、創建第一個Django程序
1、project\app
Project和App概念
Project是一個大的工程,
下面有很多功能:(一個Project有多個App,其實他就是對你大的工程的一個分類)
例如一個運維平臺是一個工程,那么他的app就是CMDB,監控系統,OA系統,
2.生成數據庫?創建超級管理員用戶
注:此步驟是在pycharm的終端里使用命令實現的
1.同步數據庫 python manage.py makemigrations python manage.py migrate2.創建超級管理員 python manage.py createsuperuser3.運行django python manage.py runserver 8000登錄頁面:
瀏覽器訪問: http://127.0.0.1:8000/admin/3.路由
1.首先在mysite文件夾下(不是app目錄,千萬別寫錯)的urls.py填寫路由規則
from django.conf.urls import url from django.contrib import admin # 導入app下的view函數 from mysite import views urlpatterns = [ url(r'^admin/', admin.site.urls), # 當用戶訪問http://127.0.0.1:端口號的時候之間交給myiste下面的views里的index函數來處理 url(r'^$', views.index), ]4.views函數
1.在myiste(app)下面的views里寫一個index函數
# Django 在返回的時候需要一層封裝,需要導入HttpResponse from django.shortcuts import render,HttpResponse# Create your views here. def index(request):#使用HttpRespons 封裝返回信息return HttpResponse('<h1>hello world!!!</h1>')django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其他大部分的Web框架則是對一類的url請求做一條路由映射,從而是路由系統變得簡潔。
2.如果要返回html頁面
1.在templates里創建index.html頁面 內容:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>第一個django程序</title> </head> <body> <h1>Hello world!!</h1> </body> </html>2.修改mysite里的views.py的index函數 from django.shortcuts import render,HttpResponse # Create your views here. def index(request): # return HttpResponse('<h1>hello world!!!</h1>') return render(request,'index.html') #找到index.html #讀取index.html返回給用戶當以上步驟都完成之后
python manage.py runserver 8000使用瀏覽器訪問:
http://127.0.0.1:8000
五、django路由系統
在Django的urls中我們可以根據一個URL對應一個函數名來定義路由規則如下:
每一個urls對應一個views里的函數
1.基本的urls對應
from django.conf.urls import url from django.contrib import admin from UserManageSys.views import index, login, register, add_user, del_userurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/$', index),url(r'^$', login),url(r'^login/$', login),url(r'^register/$', register),url(r'^user/add/$', add_user),url(r'^user/del/$', del_user), ]2.基于app的路由
根據app對路由規則進行一次分類
當app的urls很多的時候,那么就不能再工程的urls下面去設置
應該這樣設置:
1.首先在mysite下面的urls這樣設置
# 導入include from django.conf.urls import url,include from django.contrib import admin # 導入app下的view函數 from mysite import views urlpatterns = [url(r'^admin/', admin.site.urls),# 使用myister的urls規則url(r'^myister/',include('mysite/urls'))]2.在mysite下面創建一個urls.py
內容:
from django.conf.urls import url from django.contrib import admin from UserManageSys.views import index, login, register, add_user, del_userurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/$', index),url(r'^$', login),url(r'^login/$', login),url(r'^register/$', register),url(r'^user/add/$', add_user),url(r'^user/del/$', del_user), ]3.在usermanagesys下面的views里創建上面urls對應的函數
from django.shortcuts import render, redirect from django.http import Http404, HttpResponse from UserManageSys import models # Create your views here.def index(request):user_list_db = models.UserInfo.objects.all()return render(request, 'index.html', {'li': user_list_db})def login(request):if request.method == 'POST':username = request.POST.get('username', None)password = request.POST.get('password', None)user_exist = models.UserInfo.objects.filter(username=username, password=password).count()if user_exist:request.session['username'] = username return redirect('/index/') else:return render(request, 'login.html')return render(request, 'login.html', {'code': 0})def register(request):if request.method == 'POST':u = request.POST.get('username', None)p = request.POST.get('password', None)e = request.POST.get('email', None)already_user = models.UserInfo.objects.filter(username=u).count()print(already_user)if already_user:return render(request, 'register.html')else:models.UserInfo.objects.create(username=u, password=p, email=e)return render(request, 'register.html')return render(request, 'register.html')def add_user(request):if request.method == 'POST':u = request.POST.get('username', None)p = request.POST.get('password', None)e = request.POST.get('email', None)print(u, p, e)user_info = {'username': u, 'email': e}already_user = models.UserInfo.objects.filter(username=u).count()print(already_user)if already_user:data = {'status': 1, 'result': '此用戶已經存在!', 'data': user_info}return render(request, 'add_user.html', data)else:models.UserInfo.objects.create(username=u, password=p, email=e)data = {'status': 0, 'result': '用戶添加成功!', 'data': user_info}return render(request, 'add_user.html', data)return render(request, 'add_user.html')def del_user(request):if request.method == 'POST':u = request.POST.get('username', None)p = request.POST.get('password', None)e = request.POST.get('email', None)print(u, p, e)user_info = {'username': u, 'email': e}already_user = models.UserInfo.objects.filter(username=u).count()print(already_user)if already_user:models.UserInfo.objects.filter(username=u, password=p, email=e).delete()data = {'status': 1, 'result': '用戶刪除成功!', 'data': user_info}return render(request, 'del_user.html', data)else:data = {'status': 0, 'result': '用戶不存在成功!', 'data': user_info}return render(request, 'del_user.html', data)return render(request, 'del_user.html')4.訪問:
http://127.0.0.1:8000 # 登錄頁面 http://127.0.0.1:8000/register/ # 注冊頁面 http://127.0.0.1:8000/index/ # 主頁面 http://127.0.0.1:8000/user/add/ # 添加用戶頁面 http://127.0.0.1:8000/user/del/ # 刪除用戶頁面3.動態路由(傳一個參數)
比如分頁:當urls大量過多的時候比如幾百個的時候,那么肯定不會去寫幾百個路由規則
所有這個時候就需要動態urls,使用正則表達式來完成
1.在usermanagesys下面的urls寫入以下內容:
from django.conf.urls import url,include from django.contrib import admin # 導入app下的view函數 from . import views urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^book/(\d+)$', views.book), // 正則匹配 ]2.在usermanagesys下面的views寫入以下內容:
from django.shortcuts import render,HttpResponse # Create your views here. def book(request,num):print(num)return HttpResponse(num) 當用戶訪問http://127.0.0.1:8000/usermanagesys/book/數字的時候 django會在自動把參數傳給views里的book函數3.測試訪問:
http://127.0.0.1:8000/usermanagesys/book/2顯示2http://127.0.0.1:8000/usermanagesys/book/1顯示14.動態路由(傳多個參數)
多個參數它是已/來分割的
來一個url的加法
1.在usermanagesys下面的urls寫入以下內容:from django.conf.urls import url,include from django.contrib import admin #導入app下的view函數 from . import views urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^book/(\d+)/(\d+)$', views.book), ] 2.在helloapp下面的views寫入以下內容:def book(request,num1,num2):print(num1,num2)num = int(num1) + int(num2)return HttpResponse(num) 3.測試訪問: http://127.0.0.1:8000/usermanagesys/book/2/1 顯示3 http://127.0.0.1:8000/usermanagesys/book/2/10 顯示12他的順序是:正序的,你先給他傳那個值,第一個參數就是那個
5.動態的路由(Key:value的形式)
1.在usermanagesys下面的urls寫入以下內容:from django.conf.urls import url,include from django.contrib import admin #導入app下的view函數 from . import views urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^book/(?P<k1>\d+)/(?P<k2>\d+)$', views.book),這里?p<v1>這里的v1就是key,vlaue就是傳進去的值, ] 2.在usermanagesys下面的views寫入以下內容:from django.shortcuts import render,HttpResponse # Create your views here. def book(request,k1,k2):print(k1,k2)return HttpResponse(k1+k2)這樣我們就不必按照順序去取了,可以通過key,value的方式來取傳進來的值
注:可以根據傳來的值來進行判斷返回給用戶指定的url,過程略。
6.基于反射的動態路由
僅僅是通過反射來實現的,通過文件找到里面的函數然后執行!
但是在Django中不建議使用此方法。因為不同的WEB框架建議你使用不同的方式,
Django就不建議使用反射
參考網站 ? ? ? ? ?
? ? http://www.ziqiangxuetang.com/django/django-intro.html?
?
?
轉載于:https://www.cnblogs.com/dubq/p/5836225.html
總結
以上是生活随笔為你收集整理的【Python之路Day17】Python Web框架之 Django的全部內容,希望文章能夠幫你解決所遇到的問題。