网上对Django教程都处在一个入门篇,对于想深入Django却不知道如何入手。本人是一名iOS开发者,在工作闲暇时间接触了python这么语言。在最近刚刚发布的语言排行榜中python已经跻身第一名。这得力于pyhton有非常多优秀的第三方库及今年特别火的人工智能(深度学习)。今天我想为大家分享的是Django这个Web服务器框架。了解Django会更好的了解服务器的工作,同时也巩固我对python的知识面。Django的大门准备打开,are you ready !?
项目是基于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
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