全栈工程师开发手册 (作者:栾鹏)
python教程全解
我的使用环境win8+python3.6+pycharm+django2.0
博主使用的是anaconda佩戴的python3.6,所以python的位置在anaconda的安装目录下。
安装完django后,在G:\anaconda\Scripts下存在管理工具django-admin.py、django-admin.exe文件。
安装
pip install django
设置环境变量
将django包的目录添加大系统环境变量path下。由于博主使用的anaconda,所以安装目录在anaconda文件夹下
G:\anaconda\Lib\site-packages\django
G:\anaconda\Scripts
添加到环境变量path下。
验证是否成功
cmd中输入
python
import django
print(django.get_version())
创建一个服务器项目
1、使用cmd创建Django项目。
重新打开cmd,cd到你存储的目录,使用如下命令创建一个django服务器项目。
django-admin startproject hello
这将在目录下生成一个hello目录,也就是你的这个Django项目的根目录。它包含了一系列自动生成的目录和文件,具备各自专有的用途。注意:在给项目命名的时候必须避开Django和Python的保留关键字,比如“django”,“test”等,否则会引起冲突和莫名的错误。对于hello的放置位置,不建议放在传统的/var/wwww目录下,它会具有一定的数据暴露危险,因此Django建议你将项目文件放在例如/home/mycode类似的位置。
2、pycharm中创建Django项目。
菜单栏打开“文件”-“新建项目”-选择Django项目。
一个新建立的项目结构大概如下:
hello/
manage.py
hello/
__init__.py
settings.py
urls.py
wsgi.py
详细解释(很重要):
外层的hello/目录与Django无关,只是你项目的容器,可以任意命名。
内层的hello/目录是真正的项目文件包裹目录,它的名字是你引用内部文件的包名,例如:hello.urls。
hello/init.py:一个定义包的空文件。
hello/settings.py:项目的主配置文件,非常重要!
hello/urls.py:路由文件,所有的任务都是从这里开始分配,相当于Django驱动站点的内容表格,非常重要!
hello/wsgi.py:一个基于WSGI的web服务器进入点,提供底层的网络通信功能,通常不用关心。
Django项目配置
Django项目的设置文件位于settings.py文件中。这个文件,集合了整个项目方方面面的设置属性,是项目启动和提供服务的根本保证。
详解参考http://blog.csdn.net/luanpeng825485697/article/details/79253858
我们先初步修改setting.py中的下面几个配置项,其他的保持不变。
# 白名单
ALLOWED_HOSTS = ['*'] #*表示允许所有主机访问网站
# 国际化和本地化配置
LANGUAGE_CODE = 'zh-Hans' # 简体中文
TIME_ZONE = 'Asia/Shanghai' #时区 为上海
USE_I18N = False # 指定Django的翻译系统是否开启
USE_L10N = False # 是否开启数据本地化
USE_TZ = False #是否使用指定的时区(TIME_ZONE)的时间
删除MIDDLEWARE中的下面元素,因为容易产生访问失败。
'django.middleware.csrf.CsrfViewMiddleware', #取消校验
启动服务器
1、cmd中启动服务器项目。
cd进入hello目录,输入下面的命令:
python manage.py runserver
你会看到下面的提示:
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run `python manage.py migrate' to apply them.
September 07, 2016 - 15:50:53
Django version 1.10, using settings `mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Django提供了一个用于开发的web服务器,使你无需配置一个类似Ngnix的线上服务器,就能让站点运行起来。但你也不要将开发服务器用于生产环境,它只是一个简易的测试服务器。
现在,在浏览器访问http://127.0.0.1:8000/,你将看到Django的欢迎阴面,一切OK!
django开发服务器(以后省略)默认运行在内部的8000端口,如果你想指定,请在命令中显示给出,例如:
python manage.py runserver 0.0.0.0:8000
上面:Django将运行在8000端口,整个子网内都将可以访问,而不是本机。
注意: Django的开发服务器具有自动重载功能,当你的代码有修改,每隔一段时间服务器将自动更新。但是,有一些例如增加文件的动作,不会触发服务器重载,这时就需要你自己手动重启。
2、pycharm中启动服务器项目。
如果你不喜欢直接在cmd窗口中输入很长的命令,你可以用pycharm打开项目hello。并且打开文件manage.py。在菜单栏“运行”,选择“编辑结构”
直接在Script parameters中输入脚本参数runserver,选中“显示这个页面”
这样我们就可以在pycharm中调试Django项目了。
以后我们均使用pycharm来输入参数调试Django项目。
在以后的学习中我们还会遇到很多命令。我们会在对应的部分学习使用对应的命令。有什么不懂的命令都可以参考manage.py命令全解学习:
http://blog.csdn.net/luanpeng825485697/article/details/79254716
创建功能app模块
app与project的区别:
一个app实现某个功能,比如博客、公共档案数据库或者简单的投票系统;
一个project是配置文件和多个app的集合,他们组合成整个站点;
一个project可以包含多个app;
一个app可以属于多个project!
app的存放位置可以是任何地点,但是通常我们将它们都放在与manage.py同级目录下,这样方便导入文件。
我们在pycharm中使用如下的脚本参数启动manage.py来创建一个功能模块app1
startapp app1
系统会自动生成 app1目录,其结构如下:
app1/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
将功能模块添加的项目设置中,只有将项目注册到项目中,自定义的功能模块才能被系统识别调用。
修改hello文件夹下setting.py文件,将新建的功能模块名app1添加到INSTALLED_APPS 数组中。
INSTALLED_APPS = [
'app1', #将自定义模块注册到项目中
'django.contrib.admin', #admin站点
'django.contrib.auth', #身份认证系统
'django.contrib.contenttypes', #内容类型框架
'django.contrib.sessions', #会话框架
'django.contrib.messages', #消息框架
'django.contrib.staticfiles', #静态文件管理框架
]
Django服务器项目连接数据库
Django默认使用内置的SQLite数据库。当然,如果你是在创建一个实际的项目,请使用类似MySql的生产用数据库,避免以后面临数据库切换的头疼。
mysql数据库的使用参考:http://blog.csdn.net/luanpeng825485697/article/details/79235728
按照参考教程我们配置自己的数据库连接设置。
# 数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #数据库驱动名
'NAME': 'xxxxxx', #数据库名称
'USER': 'xxxxxx', # 用户名
'PASSWORD': 'xxxxx', #密码
'HOST': '127.0.0.1', #IP地址
'PORT': '3306', # 端口号
}
}
设置完后我们使用runserver重新启动服务器项目,如果没有报错,这证明连接成功。
Django的MTV结构
首先说说Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。
T 代表模板 (Template):负责如何把页面展示给用户(html)。
V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。
上面我们已经知道了如何连接数据库,如果进行服务器项目的设置,下面我们就可以根据业务进行后台架构了。
这里先对下面的工作做一下概括。
1、数据模型Model部分,将构造对象的结构和数据库的结构。
2、视图View部分,根据内容用户请求,返回数据给前端或传给模板。
3、模板Template部分,接收视图函数传递的参数,渲染html页面传给用户。
4、地址映射urls部分,将不同的网址,映射到不同的功能模块或不同的视图函数。
1、数据模型models
Django通过自定义python类的形式来定义具体的模型,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,类中的每个变量代表数据表中的一列字段。Django通过ORM对数据库进行操作,奉行代码优先的理念,将python程序员和数据库管理员进行分工解耦。
models在每个app的models.py文件中编辑。
参考http://blog.csdn.net/luanpeng825485697/article/details/79255434
按照参考文章中的教程,我们在app1模块中建立user和diary两个数据模型。
from django.db import models
# 设置对象结构(对应数据库的结构)
class User(models.Model):
username = models.CharField(max_length=200) # 字符串类型字段
password = models.CharField(max_length=200,null=True) # 整数类型字段,null=True允许为空
age = models.IntegerField(default=0) # 整数类型字段
date = models.DateField('date registered',auto_now=True) # 时间类型字段,参数为人类可读的字段名
# 模型的元数据Meta
class Meta: # 注意,是模型的子类,要缩进!
db_table = 'user'
class Diary(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE) # 外键。
content = models.TextField() # 文本类型字段
# 模型的元数据Meta
class Meta: # 注意,是模型的子类,要缩进!
db_table = 'diary'
使用命令激活模型
python manage.py makemigrations app1
python manage.py migrate
2、编写视图views
视图的实现在每个功能模块的views.py文件中实现。在app1/view.py中每个函数接收request参数,request中包含前台请求数据。views.py中的函数通过请求数据进行逻辑运算,读写数据库等过程获取响应数据。将响应数据以字符串、对象、或html视图的形式返回。
详情参考:http://blog.csdn.net/luanpeng825485697/article/details/79252001
由于视图函数多需要调用模板来返回渲染的页面,而我们还没有详细学习模板的语法。所以我们这里在app1/views.py中先增加两个简单视图函数。
- index函数,返回hello world字符串
- finduser函数,返回用户对象字典
from django.http import HttpResponse,JsonResponse,Http404
from .models import User,Diary
from django.shortcuts import render_to_response,render,redirect,reverse,HttpResponseRedirect,get_object_or_404
from django.template import Context,loader
from django.forms.models import model_to_dict
import time
# 接收请求数据返回字符串响应。http://127.0.0.1:8000/app1/
def index(request):
return HttpResponse("Hello, world") # 直接返回响应字符串
# 返回字典或json字符串
def finduser(request):
try:
userid = request.GET.get("userid", None) # 读取数据
users = User.objects.filter(id=userid) # 获取一个用户,返回QuerySet
user = users[0] # 获取第一个user对象
user_dict1 = model_to_dict(user) # 将对象转化为字典
return JsonResponse(user_dict1) # 返回前端字典
except:
raise Http404("用户不存在")
3、模板层templates
在视图函数中我们可以返回的形式多种多样,其中我们最需要的就是根据查询到的数据,动态生成页面返回给前端。(移动互联网时代下起始直接传递所需对象数据才是最常用的)
每一个Web框架都需要一种很便利的方法用于动态生成HTML页面。 最常见的做法是使用模板。
模版是纯文本文件,可以生成任何基于文本的文件格式,比如HTML,XML,CSV等。模板文件位于每个app的templates文件夹下,没有此文件夹可以手动创建。
模板包含所需HTML页面的静态部分,以及一些特殊的模版语法,用于将动态内容插入静态部分。
详情参考:http://blog.csdn.net/luanpeng825485697/article/details/79266653
地址映射urls
为了根据不同是网址调用不同的视图,我们还需要编写urls文件。这是路由文件,根据用户打开的网址对应到不同的视图函数。
前面的教程我们已经创建了hello这个Django项目和app1这个功能模块。为了方便学习后面的教程,这里我们再创建一个功能模块app2。
详解参考:http://blog.csdn.net/luanpeng825485697/article/details/79252182
案例
学习了model模型层、views视图层、templates模板层、static静态资源、urls路由映射,我们就可以来添加我们的视图函数和模板页面的设计了。
还是以上面的hello为项目名,
构建路径:
在app1文件夹下新建templates/app1/模板目录。
在app1文件夹下新建static/app1/静态资源目录。
在templates/app1/目录下添加insert.html、oneuser.html、showuser.html三个模板文件。
我们在app1的views.py文件添加5个函数:
- index函数,作为首页,只响应一个hello world的字符串。
- insertuser函数,包含了返回增加用户页面和将用户输入加入到数据库后重定向两个功能。
- finduser函数,根据指定的userid查询用户,不过返回字典对象
- findalluser函数,获取所有用户,渲染成页面。
- detail函数,查询指定userid的用户,返回网页。
我们配置hello项目的根路由为
from django.conf.urls import include,url # Django1.11中的语法
from django.urls import path,include #Django2中的语法
from django.contrib import admin
urlpatterns = [
# url是一个函数。regex和view为必填参数。regex就是用户输入的内容,view就是对应的视图生成函数
url(r'^vip/', admin.site.urls), # Django自带的超级管理员后台地址。不要用台随意的网址
url(r'^app1/', include('app1.urls')), # 映射到下级路由
path(r'^app2/', include('app2.urls')), # 映射到下级路由
]
配置app1应用的路由为
from django.conf.urls import url # Django1.11中的语法
from django.urls import path #Django2中的语法
from . import views
from django.views.generic import RedirectView
app_name = 'app1_name' # 关键是这行,这样对不同app下相同名称的url就可以进行区分了。{% url 'app1:inserpath' %}
urlpatterns = [
url(r'^$', views.index, name='index'), # ^$正则表示为空,ex:http://127.0.0.1:8000/app1/
url(r'^insert/', views.insertuser,name='inserpath'), # 直接映射到函数
url(r'^alluser/', views.findalluser,name='alluserpath'), # 直接映射到函数
url(r'^finduser/', views.finduser), # 直接映射到函数
# url通过(?P<name>pattern)来接收参数。因此(?P<userid>[0-9]+)就是一个参数。重定向到这个url时需要传递这个参数,url才能完整生成。
# ex:reverse('app1_name:detail', args=11) 生成网址/app1/11/detail/
url(r'^(?P<userid>[0-9]+)/detail/$', views.detail, name='detail'),
path('userid/<int:userid>/', views.detail),
]
这样一个基本的网站就搭建完成了。下面我们来开始对网站进行测试。
点击下载项目
http://luanpeng.oss-cn-qingdao.aliyuncs.com/csdn/django/hello.rar
自动化测试
自动化测试工作在功能模块的tests.py文件中实现