這絕對不是只是Django入門

網上對Django教程都處在一個入門篇,對于想深入Django卻不知道如何入手。本人是一名iOS開發者,在工作閑暇時間接觸了python這么語言。在最近剛剛發布的語言排行榜中python已經躋身第一名。這得力于pyhton有非常多優秀的第三方庫及今年特別火的人工智能(深度學習)。今天我想為大家分享的是Django這個Web服務器框架。了解Django會更好的了解服務器的工作,同時也鞏固我對python的知識面。Django的大門準備打開,are you ready !?

django.jpg

項目是基于Mac系統 python 2.7版本。python工具是系統自帶。如果是windows請自行百度安裝python。首先第一步安裝Django。我這邊用的是pip工具。

 sudo pip install django

我們開始搭建web框架

1.創建項目
# 指定路徑,創建一個名為Django_api的項目
cd Desktop
django-admin.py startproject Django_api
2.創建app(這里的app是指項目中的每個功能。如用戶登陸注冊可以放在同一個app中)
#進入項目路徑,創建一個叫用戶的app
cd django_api
django-admin startapp users
django目錄.png
3.查看是否部署成功
python manage.py runserver 0.0.0.0:8000

#July 26, 2017 - 01:49:25
#Django version 1.11.2, using settings 'django_api.settings'
#Starting development server at http://0.0.0.0:8000/
#Quit the server with CONTROL-C.
#提示此消息代表部署成功

現在我來講解一下目錄中的文件有何作用

django_api
|-- _init_.py
|-- settings.py
|-- urls.py
|-- wsgi.py
|--users
||-- _init_.py
||-- admin.py
||-- apps.py
||-- models.py
||-- tests.py
||-- view.py
|-- db.sqlite3
|-- manage.py

我們先講解django文件目錄下面的幾個文件

|-- init.py: 代表的是這是一個python文件
|-- settings.py : 服務器全局設置文件
|-- urls.py : url跳轉控制器(根據url跳轉對應的app中的view)
|-- wsgi.py : wsgi用于配置部署至云服務器的
|-- db.sqlite3: 系統默認用sqlite3數據庫(如果用mySQL或其他數據庫可忽略)
|-- manage.py: 用于啟動服務器,更新數據庫等操作庫

users文件夾中

||-- init.py:代表的是這是一個python文件
||-- admin.py:配置admin后臺管理系統的顯示方式及功能
||-- apps.py :配置users這個app的基本參數
||-- models.py:存放用戶模型
||-- tests.py:測試框架編寫
||-- view.py : 具體實現邏輯


講解了項目的創建及文件的作用,現在開始進行項目編寫

首先了解一下setting文件的配置,我主要講解一些重要的地方。如有些未提及,可自行搜索。

ALLOWED_HOSTS = [u'0.0.0.0',u'127.0.0.1']

ALLOWED_HOSTS設置的是允許用戶通過那個url訪問此服務器,如果未配置則訪問不到該服務器,用于我們現在處于測試狀態,我們可以寫我們的本地地址以便于測試

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users'
]

在此配置中添加了最后一行'users',代表此app允許在此服務器上面運行,如果未配置卻執行該app則會報錯

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "testDjango",
        'USER':'root',
        'PASSWORD':'123456',
        'HOST':'localhost',
    }
}

數據庫我改為mysql數據庫。注意key為大寫且固定字段不可隨意編寫。請確保數據庫配置正確。否則會編譯不通過。
NAME: 數據庫名稱
USER: 數據庫用戶名
PASSWORD:數據庫密碼
HOST:數據庫域名

TEMPLATES = [
    {  'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,"templates")],
        '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',
            ],
        },
    },
]

templates配置此路徑后,在對應路徑創建文件夾,可把HTML文件放入此路徑中。服務器才能識別(故 html文件應該存放在templates文件下)

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]

應在對應位置創建static文件夾,用于存放的是css等靜態文件。


基本配置完成后我們開始編寫第一個請求

打開urls文件編寫相應代碼(LoginView則在后面具體講解如何編寫)
# urls.py
from users.views import LoginView
urlpatterns = [
    url(r'^login/',LoginView.as_view()),
]

當用戶發起http請求是訪問到該路徑如 http://0.0.0.0:8000/login?username=1&password=1
時。代表的是訪問該域名下的login路徑,通過urlpatternp配置會跳轉到LoginView.as_view()。傳遞的參數為username=1,password=1參數。

打開users中的views.py 實現具體的邏輯處理
class LoginView(View):
    def get(self,request):
        return HttpResponse("這是get請求")

    def post(self,request):
         return HttpResponse("這是post請求")

這是一個很簡單是處理請求。用戶訪問到該url時,返回的是一個字符串表明是什么請求。在下面我會告訴你如果去實現登陸,驗證請求參數等


實現登陸最重要的是通過用戶表。對用戶表進行增刪改查功能。現在開始來講解一下。

1.打開users下的models.py文件

# models.py
from __future__ import unicode_literals
from datetime import datetime
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    nikeName = models.CharField(max_length=100,null=False,default="",verbose_name=u"昵稱");
    birthday = models.DateField(verbose_name=u"生日",null=True,default=datetime.now);
    image    = models.ImageField(upload_to="image/%Y/%m",default="image/default.png")

    class Meta:
        verbose_name = "用戶信息"
        verbose_name_plural = verbose_name;

    def __unicode__(self):
        return self.username;

這個模型與普通創建的模型不一樣,它是基于AbstractUser創建的模型,是重載了系統用戶模型。可通過系統的方法來實現登陸等操作。這模型中添加了別名,生日,圖片等字段。verbose_name代表的是添加一個別名用于在admin中顯示的字段。重寫class Meta:的道理也是一樣。

2.修改settings文件

# settings.py
# 重裝自定義User表為系統用戶表
AUTH_USER_MODEL = 'users.User'

3.更新到數據庫

django中有兩個默認的方法,打開終端,cd 到目錄下執行

python manage.py makemigrations
python manage.py migrate

第一個是告訴數據庫有什么表添加。第二個是創建表。

4.添加數據

user = User.objects.Create_user(username='123',password='123')

創建系統用戶模型序調用User.objects.Create_user() 而不是 User.objects.Create()需要注意。

5.添加校驗form

創建一個user_form.py文件

# user_form.py
from django import forms
class LoginFrom(forms.Form):
    username = forms.CharField(required=True)
    password = forms.CharField(required=True,min_length=5)

6.view的實現

from django.views.generic.base import View
from django.http import request,HttpResponse
from django.contrib.auth import authenticate,login
from .models import User
from user_forms import LoginFrom

class LoginView(View):
    def get(self,request):
        form = LoginFrom(request.GET);

        #判斷校驗有沒有正確
        if not form.is_valid():
            return HttpResponse(form.errors)

        #判斷數據庫有沒有該有用戶
        user = authenticate(username=user_name, password=pass_word);

        #如果有用戶登陸
        if user is not None:
            login(request, user)
            return HttpResponse("登陸成功");

        return HttpResponse("登陸失敗")

    def post(self,request):
        return HttpResponse("post請求暫未處理")

django出現的html網頁的處理,admin管理系統的處理,還有其他功能,將在下一章為你們展現。希望本章讓大家對django有個了解。完成一次http請求后的django的執行過程。謝謝大家的閱讀。

下面是對數據庫表的操作

1.Person.objects.all()
2.Person.objects.all()[:10] 切片操作,獲取10個人,不支持負索引,切片可以節約內存
3.Person.objects.get(name=name)  #get是用來獲取一個對象的,如果需要獲取滿足條件的一些人,就要用到filter
4.Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名稱嚴格等于 "abc" 的人
5.Person.objects.filter(name__iexact="abc")  # 名稱為 abc 但是不區分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件
6.Person.objects.filter(name__contains="abc")  # 名稱中包含 "abc"的人
7.Person.objects.filter(name__icontains="abc")  #名稱中包含 "abc",且abc不區分大小寫
8.Person.objects.filter(name__regex="^abc")  # 正則表達式查詢
9.Person.objects.filter(name__iregex="^abc")  # 正則表達式不區分大小寫filter是找出滿足條件的,當然也有排除符合某條件的
10.Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person對象
11.Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名稱含有abc, 但是排除年齡是23歲的0
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容