[TOC]css
版本問題 1.X 2.X 統一制定1.11.11 安裝 pip3 install django==1.11.11 測試 django-admin
wsgiref模塊能根據功能的不一樣拆分紅不一樣的文件,用戶在瀏覽器窗口輸入url之因此能狗獲取到相應的資源,是由於後端早已經開設了相應 資源接口。html
wsgiref特色:前端
urls.py:路由與屬性函數的對應關係python
views.py:裏面就是放的一堆視圖函數(視圖函數也能夠是函數也能夠是類)mysql
templates文件夾:裏面放的就是一堆HTML文件(模板文件夾)web
大白話:wsgiref模塊做用是幫你將複雜的socket鏈接封裝,將用戶輸入的數據作處理,並把後端發送給瀏覽器的數據也作處理。sql
from wsgiref.simple_server import make_server
數據是寫死的,萬年不變數據庫
數據是動態獲取的:django
提供了一個能夠在HTML頁面上書寫相似於python後端的 代碼,來操做數據(模板語法)flask
pip3 install jinja2 下載安裝模塊
flask框架模板語法使用的就是jinja2模塊,因此只要下載了flask框架,就會自動下載jinja2模塊。
模板語法(jinja2)模塊語法很是貼近python語法,可是並非全部的框架使用的都是jinja2模塊語法
模板語法 {{}} 變量相關 {%%} 邏輯相關 在HTML文件內的語法示例: {{ xxx }} <p>{{xxx.username}}</p> <p>{{xxx['password']}}</p> <p>{{xxx.get('hobby')}}</p> <p>{{xxx.get('hobby')[0]}}</p> <p>{{xxx.get('hobby').1}}</p> {%for user_dict in xxx %} <tr> <td>{{ user_dict.id }}</td> <td>{{ user_dict.name }}</td> <td>{{ user_dict.hobby }}</td> </tr> {% endfor %}
A:socket B:路由分發 C:模板渲染 django A:用的別人的 wsgiref B:本身寫的 C:本身寫的 flask A:用的被人的 werkzeug B:本身寫的 C:用的別人的 jinja2 tornado A,B,C都是本身的。追求速度
python三大主流框架
異步非阻塞,自然支持高併發,甚至能夠用它來開發遊戲服務器。
注意事項
版本問題
1.x版本
2.x版本
3.x版本(目前不用考慮)
推薦使用1.x版本里面的1.11.09-1.11.13,由於2.x版本才發行不久,新公司或者更換了版本的公司纔會使用,通常使用1.8或1.11,現已逐步往1.11轉
安裝
pip3 install django==1.11.11
測試是否安裝成功
命令行輸入:django-admin
命令行
建立django項目
語法:django-admin startproject mysite(項目名)
效果:建立一個mysite文件夾
啓動django項目(先切換到項目目錄下)
語法:python manage.py runserver 必須在cmd管理員啓動(django默認端口是8000)
建立具備獨立功能的app,一般狀況下應該能作到見明之義。
語法:python manage.py startapp app名字
在Django項目中建立好app以後必定要去settings.py註冊纔有效
注意:
1.使用命令行建立的django項目是不會自動建立templates模板文件夾的,只能本身手動建立
2.命令行建立的django項目不但沒有templates文件夾,配置文件中也沒有填寫路徑(而pycharm建立會自動添加)
全名application 應用,此app非彼app.
django實際上是一個專一於開發app的web框架,一個空的django項目就相似於一所大學,app就相似於大學裏面的各個學院。
每一個app就相似於不一樣的功能模塊
mysite -mysite --__init__.py --settings.py 項目配置文件 --urls.py 路由視圖函數對應關係,項目的總路由 --wsgi.py -manage.py app01 --migrations文件夾 數據庫改動記錄 ----__init__.py --__init__.py --admin.py django後臺管理 --apps.py 註冊app類 --models.py 模型類(orm) --tests.py 測試文件 --view.py 視圖函數(******) db.sqlite3 django自帶的一個小型用於本地測試的數據庫(對日期格式的數據不是很敏感)
1.代碼修改了始終沒有效果: 1.在同一個端口起了多個服務 一直跑的是最開始的那個服務 2.瀏覽器緩存問題 2.建立app以後必定必定要先去setting文件中註冊 1.django可以自動重啓 可是它的重啓機制 2.只要檢測到你的代碼有變化 在必定的時間間隔內就會自動重啓 3.因此有時候可能會出現 你代碼還沒寫完 就已經自動重啓了 1.python解釋器不要用3.7及以上版本 2.計算機名稱不能有中文 3.文件名稱也儘可能不要用中文 4.一個pycharm窗口就跑一個django項目
1.HttpResponse 返回字符串 return HttpResponse('字符串') 2.render 返回html頁面 return render(request,'templates文件夾下的html文件名',{'xxx':'hello world'}) 頁面上就能夠經過{{xxx}}拿到hello world 模板的渲染(將數據在後端按照模板語法放入html對應的位置) 3.redirect 重定向 return redirect(url) # url能夠是別人網站的全路徑 也能夠是本身網站的url後綴 return redirect('/index') return redirect('https://www.mzitu.com')
什麼是靜態文件 網站所使用到的提早已經寫好了的文件 eg: css js 第三方的組件 bootstrap sweetalert fontawesome
網站所用到的html文件統一放到templates文件夾中
那針對網站所使用到的靜態文件也應該單獨找一個文件夾來存儲
這個文件夾 默認狀況下都叫static,須要手動本身建立
static -css 網站所用到的全部的css文件 -js 網站所用到的全部的js文件 -image 網站所用到的全部的圖片文件 第三方文件
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'static1'), os.path.join(BASE_DIR, 'static2') ]
當你的接口前綴正確以後 會拿着後面的路徑依次去下面列表中的每個文件夾下查找對應的資源 順序是從上往下依次查找 若是都沒有找到纔會報錯
這裏的static是文件夾路徑
那麼問題來了,若是STATIC_URL要修改,其他的所有文件都要修改,及其不方便。咱們怎麼辦呢?
咱們能夠想辦法動態綁定,讓STATIC_URL不管怎麼改變,對應的href前綴跟着改變就解決了。
{% load static %} //相似於import導入 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
form表單默認是以get請求提交數據的 http://127.0.0.1:8000/login/?username=admin&password=123 action 1.不寫 默認朝當前地址提交數據 2.全路徑 3.後綴(/index)
request.method # 結果是一個純大寫的字符串 GET/POST request.POST # 獲取post請求提交的數據 相似因而一個大字典 # <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
get方法:針對只有一個值,用戶名、密碼 request.POST.get() # 只會取列表最後一個元素 request.POST.getlist() # 取出整個列表,針對對選框、多個值操做
一般狀況這樣寫:
POST請求相似於一個大字典
須要你本身提早建立好對應的庫
1.先去配置文件中配置相關參數 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 數據庫類別 'NAME': 'jeff', # 庫的名字 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'password':'123', 'CHARSET':'utf8' } } 2.在項目名或者應用名下面的__init__文件中告訴django使用pymysql連接數據庫而不是用默認的mysqldb import pymysql pymysql.install_as_MySQLdb()
django orm不會幫你建立庫 只能幫你自動建立表
orm對象關係映射 類 表 對象 記錄 屬性 字段值 做用:可以讓一個不會數據庫操做的小白也可以經過Python面向對象語法 句點符來簡單快捷的操做數據
首先須要先去對應的應用下的models.py中書寫你的模型類
對於主鍵id,django orm會自動幫你建立一個名字爲id的主鍵字段。當檢測到你建立了主鍵,那麼會使用你本身建立的。若是沒有那麼會自動幫你建立。 models.py class User(models.Model): id = models.AutoField(primary_key=True) // id int primary key auto_increment name = models.CharField(max_length=32) // name varchar(32) password = models.IntegerField() // password int
1.python3 manage.py makemigrations # 僅僅是將你對數據庫的改動記錄到某個小本本上(migrations文件夾) 2.python3 manage.py migrate # 將改動真正的同步到數據庫中 """ 上面兩個命令永遠是成對出現的 只要你執行了1 就必需要執行2 """ *******只要你動了models.py跟數據庫相關的代碼 你就必需要從新執行上面的兩條命令來保證數據庫與models.py一致*********** 3.逆向數據庫到模型 python manage.py inspectdb > app名字/models.py
對於增刪改查都須要先獲取用戶選擇修改的數據id。那麼咱們怎麼獲取呢?
第一步:把用戶的id綁定到按鈕標籤上
咱們能夠拼接url:獲取用戶點擊的標籤id。綁定id <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a>
第二步:獲取綁定到url的用戶id
字段的增 1.create() user_obj = models.User.objects.create(name=username,password=password) # 該方法有返回值 返回值就是當前被建立的對象自己 2.對象綁定方法 # 1 先生成一個User對象 user_obj = models.User(name=username,password=password) # 2 調用對象的綁定方法 user_obj.save() 字段的查 1.filter() //相似於where from app01 import models res = models.User.objects.filter(username='jason') # select * from user where # 返回的結果是一個列表 支持索引取值可是不支持負數而且不推薦使用 推薦你使用它給你封裝好的方法 推薦(重):user_obj = res.first() # filter方法條件不存在的時候 不會報錯返回的是一個空列表 filter括號內直接放多個關鍵字參數 而且多個關鍵字參數之間是and關係 models.User.objects.filter(username='jason',password='123') 相似於sql語句:# select * from user where username='jason' and password='123'; 2.查全部的數據 1.filter() 括號內不寫拿全部 2.all() 拿全部 字段的改 # 方式1(推薦) 批量更新 models.User.objects.filter(id=edit_id).update(name=username,password=password) # 方式2(瞭解) # 1 先獲取數據對象 edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改對象屬性 edit_obj.name = username edit_obj.password = password # 3 調用對象的綁定方法保存 edit_obj.save() 刪 models.User.objects.filter(id=delete_id).delete() # 將filter過濾出來的數據所有刪除
原文出處:https://www.cnblogs.com/guyouyin123/p/12147138.html