django 基礎

1. 安裝django:
python -m pip install django (用pip安裝),在python安裝目錄 scripts裏就會有一個django-admin.py
2. 建立一個project:
django-admin startproject guest2 #執行完後在對應目錄下就生成了一個guest2目錄,裏面包含一些目錄和文件,settings.py是主配置文件,urls.py是路由文件,
3. 建立一個應用:
cd guest2
python manage.py startapp sign
sign下面的文件分別是:
admin.py: django 自帶了admin 後臺, 把models裏面的表映射到後臺管理.
apps.py:應用的配置, 蟲師都沒用過
models.py: ORM:映射數據庫,建立和管理數據庫表的文件 (編程語言 ---> 數據庫驅動(pymysql) --->數據庫)
tests.py: 寫單元測試的
views.py: 寫django功能的處理邏輯
4. 啓動建立的項目:
python manage.py runserver
5.訪問方法:
 
6. 應用,index page
a. 經過表單或連接發送請求
<a href = "/admin/">go back to admin</a>
b. 指定路徑
c. 打開url 配置文件settings.py
INSTALLED_APPS裏須要加上建立的項目名,如sign
ROOT_URLCONF = 'guest2.urls' 經過 這個匹配路徑解析
d. 經過urls.py文件找到views (視圖),但先要導入views: from sign import views,而後再加path:
path ('index/', views.index)
e. views.py裏建立一個index 函數, return HttpResponse ("login ok") 對象或者return render(request, "index.html")
 
7. html裏的form表單有個action 屬性,能夠指定一個action:
<form action="/login_action/">
這時候再點擊login button的話,能夠看到url變成了/login_action/
因此這時候能夠像index 同樣,add a path, view.login 函數
8. def index(request): request:接收客戶端的全部請求
能夠在函數裏用:
login_username = request.GET.get("username")
login_password = request.GET.get("password")
print(login_username)
print(login_password)
取到了username和password
 
9. django裏面對字典的處理:
在函數裏處理返回信息用以下方式:
return render(request, "index.html", {"error": "username or password is empty."})
這時候須要在html裏面加上{{error}},才能夠接收顯示這個信息。
 
10. get請求不安全,username和password會顯示在url上,因此最好用post請求:
<form action="/login_action/" method="post">
函數裏面也改爲POST請求
login_username = request.POST.get("username")
在用post請求的時候,可能提示forbidden about CSRF,解決方法:
1.能夠在settings.py裏的MIDDLEWARE註釋掉
2.能夠在HTML里加上 {% csrf_token %} 
 
11. 若是想什麼也不輸也返回一個頁面,能夠在urls里加path('', views.index)
12.也能夠用return HttpResponseRedirect("/event_manage/")的方法返回一個地址
13.設置cookie (不安全):
response= HttpResponseRedirect("/event_manage/")
response.set_cookie('username', login_username, 100)
return response
 
username = request.COOKIES.get("user", '') #讀取瀏覽器
 
14. 設置session(安全), 須要建立database, session存在database中
settings.py裏面的INSTALLED_APPS裏面已經有的一些表,只是須要用命令生成一下
用命令python manage.py migrate 能夠生成settings.py裏的那些表.
 
request.session['user'] = login_username
 
username = request.session.get("user", '')
15. 建立用戶:
python manage.py createsuperuser
 
這時候能夠login /admin/頁面了, login後能夠add user..
新加的用戶沒有權限login,須要check Staff status 便可。
 
16. from django.contrib import auth 導入認證模塊
auth.login(request, user)
但退出後cookie也不刪,須要加上:
@login_required 這樣便可
 
17. ORM:Object Relational Mapping, 是一種程序技術,用於實現面向對象編程語言裏不一樣類型系統的數據之間的轉換 [1]  。從效果上說,它實際上是建立了一個可在編程語言裏使用的--「虛擬對象數據庫」, 在django裏面就有ORM, 正常狀況下編程語言和數據庫之間須要經過數據庫驅動來關聯, python裏就是pymysql,但寫代碼的話仍是SQL語句, 像select ...from ... where ...可是由於有了ORM,因此能夠用編程語言直接建立數據庫, 用class xxxx(models.Model) 建立類來實現.
 
18. MTV: Models(數據庫) , template, views(視圖)
django 提供完善的模型model層主要用來建立和存取數據,不須要 咱們直接對數據庫操做。
django模型基礎知識:
每一個模型是一個python類,繼承django.db.models.model類。
該模型的每一個屬性表示 一個數據庫表字段,全部這一切,已經給你一個自動生成數據庫訪問的API.
打開../sign/models.py文件,完成表的建立
 
19. 建立models裏的數據庫:
須要安裝pymysql: python -m pip install pymysql
class Event(models.Model):
name=models.CharField(max_length=100) #標題
limit=models.IntegerField() #限制人數
status=models.BooleanField() #狀態
address=models.CharField(max_length=200) #地址
start_time=models.DateTimeField() #日期
create_time=models.DateTimeField(auto_now=True)
 
def __str__(self):
return self.name
 
而後用python manage.py makemigrations sign
python manage.py migrate
去建立數據庫
 
20. 在admin.py裏須要導入建立的兩個表:
from sign.models import Event, Guest
admin.site.register(Event) #把表註冊到後臺
admin.site.register(Guest)
 
這時在/admin/ page就能夠看到這兩個表,可是若是添加記錄的話顯示的是對象,若是想顯示成數據庫記錄,須要建立一個類:
class EventAdmin(admin.ModelAdmin):
list_display=['name', 'limit', 'status','address', 'start_time']
search_fields=['name']
list_filter = ['status']
 
class GuestAdmin(admin.ModelAdmin):
list_display=['realname', 'phone', 'email', 'sign', 'event']
search_fields=['realname','phone']
list_filter = ['sign']
 
admin.site.register(Event, EventAdmin)
admin.site.register(Guest, GuestAdmin)
 
21. 數據庫的增刪改查:
django須要進入shell 模式:
python manage.py shell
from sign.models import Event, Guest
Event.objects.all() #查全部記錄
 
增長一條記錄:
e1 =Event(id=3, name='hongmi8', limit=2000, status=True, address='Beijing',start_time=datetime(2018,5,22,14,00,00))
e1.save()
 
刪除記錄:
e1=Event.objects.get(name_contains='heimi')
e1.delete()
 
查詢記錄:
e2=Event.objects.filter(name='meizu')
e2
e2.address
e3=Event.objects.filter(name __contains="發佈會") # 模糊查詢__contains
len(e3)
for e in e3:
e.name
 
更新記錄:
e1=Event.objects.get(name='Huawei')
e1.name='MiNote5'
e1.save()
 
g3=Event.objects.select_for_update().filter(name='Minote5')
g3.update(name='haha')
 
22. 數據庫切換:安裝wampserver, login: http://localhost/phpmyadmin (root, 空)
先建立一個數據庫: guest
而後在項目下建立一個my.cnf:
[client]
host=127.0.0.1
port=3306
database=guest
user=root
password=''
default-character-set=utf8
 
在settings.py裏添加DATABASE改爲mysql的:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': os.path.join(BASE_DIR,'my.cnf'),
},
}
}
 
在項目下面的__init__.py里加上:
import pymysql
pymysql.install_as_MySQLdb()
能夠直接連mysql數據庫了
如今能夠執行python manage.py migrate去建立數據庫了,執行完刷新mysql,
還須要執行python manage.py createsuperuser建立 admin
 
最好安裝一個mysql客戶端,如mysqlyog ultimate
 
提供CSS樣式
能夠copy 網上的代碼。
django還有個bootstrap 庫, 用python -m pip install django-bootstrap3安裝
 
23.應用bootstrap3:
1.在settings.py裏添加:"bootstrap3"應用
2.在index.html裏添加:bootstrap3,引用bootstrap3樣式:
在<head>裏添加:
{% load bootstrap3 %}
{% bootstrap_css %}
 
24.分頁器:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger.
 
25. django test:
django的TestCase是繼承的unittest.TestCase, 不須要用unittest.main()方法去執行測試,
tests.py裏寫單元測試:
django裏有一個client類,能夠模擬客戶端的http的get 和post請求,因此在單元測試的時候會用到.
以下:
class IndexPageTest(TestCase):
 
def test_index(self):
response = self.client.get('/index/')
self.assertEqual(response.status_code, 200) #200說明成功獲取到了index頁面
self.assertTemplateUsed(response, 'index.html') #斷言template返回的是index.html頁面, 是django裏面特有的。
 
測試的時候用: python manage.py test
 
測試login success,返回的應該是302頁面而不是200,由於login success會有一個跳轉,跳轉就是302
django運行單元測試的時候不會真的去查database, 因此須要初始化數據:
django.contrib.auth.models import User #須要用的表是auth.models下面的user表
 
須要用setUp 和tearDown 初始化:
def setUp(self):
User.objects.create_user("admin", "admin@123.com", "admin123456") #建立一個user
 
def test_login_success(self):
user_info={「username": "admin", "password":"admin123456"}
response = self.client.post('/login_action/', data =user_info)
self.assertEqual(response.status_code, 302)
def test_login_user(self):
user=self.client.get(username = 'admin')
self.assertEqual(user.username, admin)
self.assertEqual(user.email, 'admin@123.com')
def test_login_user_null(self):
response=self.client.post('/login_action/', {'username': '', 'passowrd': ''}
self.assertEqual(response.status_code, 200)
self.assertIn(b"username or password null", response.content)
 
還能夠測username or password ==error
 
測event_manage的時候,正常狀況下是有跳轉的,若是沒有login的話會返回到index頁面,因此執行會報錯,說是302,而不是200,是由於這個方法是@login_required的,若是把這個註釋掉就能夠運行成功,可是這樣會很麻煩,因此須要有一個初始化一個user數據,就是在setUp里加上建立user,而後再作一個預先login的處理才行。
def setUp(self):
User.objects.create_user("admin", "admin@123.com", "admin123456")
Event.objects.create(name='xiaomi6', limit=2000, address='beijing'
login_user={'username':'admin, 'password':'admin123456'}
self.client.post('/login_action/', data=login_user)
 
def test_event_manage(self):
response=self.client.post('/event_manage/')
self.assertEqul(response.status_code, 200)
self.assertIn(b"xiaomi6', response.content)
 
 
django rest framework: 快速開發接口的平臺。
相關文章
相關標籤/搜索