#Django中的模块
模型Model:数据层,处理与数据相关的所有事物
视图View:视图层,用来处理用户发来的请求
模板Template:模板层,通过视图层函数渲染html模板,得到动态的前端页面
路由Url:网站的入口,关联刀对应的视图函数,访问网址就对应一个函数
表单Forms:表单,用在在浏览器输入数据提交,并对这些数据进行验证
后台Admin:Django自带一个管理后台,对你提交的数据进行管理
配置Settings:Django的设置,配置文件


#Django的基础命令
django-admin startproject 项目名->创建一个django项目
python manage.py startapp 应用名->项目中创建一个应用
python manage.py shell ->进入调试艾玛的调试模式
Python manage.py makemigrations ->数据库创建更改文件
Python manage.py migrate ->同步刀数据库进行更新
python manage.py flush ->清空数据库
python manage.py runserver 0.0.0.0:8000 ->启动开发服务器
python manage.py +回车 可查看更多命令

#ipython工具
直接pip的方式安装
它里面比如:
import datetime
datetime.(+tab键可直接查看datetime有哪些模块)`

#Django安装创建
直接pip安装,可django==2.1.2指定版本的方式安装
安装完成可进ipython直接import django然后django.VERSION的查看版本

创建django可通过:django-admin startproject Django_test
通过ls查看目录文件:ls,然后直接cd进入刚创建的目录,然后直接python manage.py就可看到命令了
用编辑器打开创建的项目,第一个__init__是初始化文件,第二个settings是配置文件,再下面urls是url设置,可以理解为网站的地址信息,再后面的wsgi是用于django服务器上部署和上线用的。
然后创建具体文件,首先cd..到项目根目录,然后python manage.py startapp app
新创建的文件目录中有一个migrations的目录用于数据库的迁移,__init__依然是一个初始化的文件,然后admin是当前管理后台,apps是当前app的配置信息,models定义映射数据库的数据和初始化的
,tests是个自动测试化的模块,views是逻辑处理的模块。


BASE_DIR:当前项目在系统中的路径,项目创建之初就自动生成了,不需要修改
SECRET_KEY:主要用于对数据进行加密处理的,也是项目创建之初就自动生成了,
DEBUG:是一个调试模式,开发的时候选择True,就可通过命令行查看一些调试信息以及错误信息,如果在项目上线之后就要设置False,因为不允许把错误信息报出来。
ALLOWED_HOSTS:可以允许访问的一个空间,如果DEBUG为False的时候那么这个就是必填的了,否则程序将无法启动,如果要允许所有的程序都启动则:ALLOWED_HOSTS[‘*’]即可。
INSTALLED_APPS:用于定义应用的,就比如上面创建的一个app就要在这里面去配置它,否则项目捕捉不到这个应用的,在项目创建之初后台就已经创建了很多默认的应用了,django.contrib.admin:就是admin后台管理,.auth:就是内置的用户认证系统,.contenttypes:用于记录所有models源数据的,也是跟models有关的,sessions:它是一个会话系统,它一般用于标识当前网站访问的用户的身份的,.messages信息功能,.staticfiles一些静态资源,css等等。
MIDDLEWARE:是一个中间件
ROOT_URLCONF:它是所有路由的一个根路由,因为项目里可能有多个应用每个项目里可能有自己的应用,one.urls就是定义项目的一个根路由。
TEMPLATES:就是静态文件的配置了,比如说模板,模板里html,如何去定义html的位置,通过模板去定义它。
WSGI_APPLICATION:跟WSGI一起做一个绑定的
DATABASES:用于设置数据库的
AUTH_PASSWORD_VALIDATORS:一个密码验证
LANGUAGE_CODE:设置语言的,比如中国的或者等等
TIME_ZONE:时区

路由器

路由器

简单的说,url就是常说的网址,每个网址代表不同的网页。
在django中url也称为urlconf
每个url地址对应一个唯一的views视图函数

哪里存在路由?

根目录项目中urls.py是根路由,根路由可以集合所有应用路由
每个应用下创建自己的urls.py,这个urlspy属于每个应用的独有路由,通过集成或者说绑定到根路由中进行使用。

路由常用方法,变量与views的绑定

from django.urls import path,include 导入url编写模块
from django.contrib import admin 导入admin功能模块
urlpatterns:整个项目的url集合,每个元素代表一条url信息

path('admin/',admin.site.urls)设置admin的url,’admin/‘代表url地址,即http://127.0.0.1:8080/admin/,admin后边的斜杠为路径的分隔符,admin.site.urls是url对应的视图函数

path('',include('app.urls'))如果url为空即代表为网站的域名,即127.0.0.1:8000,通常为网站的首页,include是将应用中的urls包含进来

另一种写法:
from app import urls as app_urls
path('',include(app_urls))

扩展知识:网址分两部分,domain域名与url按照上边的地址分别是127.0.0.1:8000和admin

视图

views是django的mvt中的v部分,主要负责处理用户的请求和生成相应的内容,然后在页面或其它类型文档中显示。

视图中的基本写法:

from django.http import HttpResponse
def index(request):
return HttpResponse('hello django')

然后再创建一个新的项目文件,进入虚拟环境,django-admin startproject two,然后进入创建的这个项目目录,然后python manage.py startapp app,

路由器url的变量(参数)设置

###url中的参数
在url后边用?开始,键与值用等号连接,每对键值用&号区分,如:http://127.0.0.1:8000/app?name=dewei&age=30
在路由的参数中用分隔符分开,如:http://127.0.0.1:8000/app/dewei/30


###django2的url变量类型
字符串类型:匹配任何非空字符串,但不包含斜杆,在不指定类型的前提下,默认字符串类型str:name
整型:匹配0和正整数int:age
slug:可理解为注释,后缀或附属等概念slug:day
uuid:匹配一个uuid格式的对象uuid:uid类似xxx-xx-xx

支持url类型的方法

from django.urls import path 2.0以后新方法

from django.conf.urls import url 2.0以前方法,不支持参数中的类型,只能通过正则表达的方式进行基本的匹配。


###Django2.0以前url参数匹配简介
url(r'add/(?P<name>\w+)/(?P<age>\d+)$')
r非转义原始字符串
w+ 匹配1个或多个包括下划线在内的任何字字符:[A-Za-zO-9]
d+ 匹配1个或多个数字

为url设置别名

path('add',view_function,name='add')
别名可以在重定向和模板定义的时候直接用别名替代

视图读取参数

?形式的参数->request.GET.get(参数名)
以分隔符形式的参数
def index(request,参数名,参数名):
print(参数名)

视图的三个部分

用户的请求request

浏览器向服务器发送的请求,包含用户信息,请求内容和请求方法
dir(request)查看request对象的所有方法

常用的request对象的方法

1.request.GET->获取url上?形式的参数
2.request.POST->获取post提交的数据
3.request.path->请求的路径,比如请求127.0.0.1/test/1,那这个值就是/test/1
4.request.method->请求的方法get or post
5.request.COOKIES->请求过来的cookies
6.request.user->请求的用户对象,可以通过它判断用户是否登录,并获取用户的信息
7.request.session->一个既可读又可写的类似于字典的对象,表示当前的会话
8.request.META->一个标准的Python字典,包含所有的HTTP首部。具体的头部信息取决于客户端和服务器(有很多信息)

常用的返回对象

HttpResponse可以直接返回一些字符串内容
reder将数据在模板中渲染并显示
JsonResponse返回一个json类型 通常用于前端进行ajax交互
from django.http import HttpResponse
from django.shortcuts import render
from django.http import JsonResponse

视图面向对象的写法

from django.http import HttpResponse
class Index(View):

`def get(self,request,name,age):`

    `print(dir(request))`

    `return HttpResponse('hello i am {0},age is {1}'.format(name,age))`

对用户请求的逻辑处理handler
讲处理后的数据返回给用户response

#restul规范&http协议
##Restful
Url定位资源,简单来说,通过一个url地址可以让我们知道这个地址所要提供的功能是什么。
比如说:127.0.0.1/add/user那么可以看出 我们这个url要做的事情就是 添加一个用户
再比如说,127.0.0.1/get/user/1,就可以很轻松的读出来,是获取一个用户并且这个用户id是1
归纳一句话:url一切皆资源


##Restful常用方法
1.Get获取资源时使用,比如我们查看一个网页
2.Post提交资源时使用,比如我们注册一个用户的时候
3.Put修改资源时时候,比如我们修改自己的用户信息的时候
4.Delete删除资源时使用,比如我们注销我们的账号的时候


##Http协议
网上应用最为广泛的一种网络协议。所有的www文件都必须遵守这个标准。


##Http的无状态性
无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求,但是当同一个浏览器再次给你服务器发送请求的时候,服务器并不知道它就是刚才那个浏览器。

简单的说,服务器不会记得你,所以就是无状态协议

##Http常用状态码
200 成功
400 请求错误,一般是参数格式有误的时候出现
403 禁止访问
404 没有获取到url地址
405 方法禁用,比如这个地址指定用get方法,但你用了post,就会有这个提示
500 服务器异常


##unicodeencodeerror报错 `PYTHONIOENCODING=utf-8 python manage.py runserver`这样的方式执行直接就是在utf-8下执行
## 练习:simple api server ### 什么是API接口服务器 API接口是一些预先定义的函数,每个接口对一类资源(Restful)或者说对接一项功能,通过服务器的形式承载起来

前后端分离,html、js、css不在接口服务器中存在

###API服务器常用的传输数据类型
目前使用json格式比较主流

项目:

创建中专接口服务器,通过访问我们的中专接口服务器,获取到豆瓣开源的音乐,电影,数据信息。

所用知识点

Django2中urlo与views模块

Requests http模块的使用

初探restful规范写法

模板

Template介绍,配置,与view的绑定
###Template模板
模板可以动态生成Html网页,它包括部分html代码和一些特殊的语法

##Template配置方法
一般Template模板存放在“templates”目录中

通过在项目Settings的templates的DIRS列表中添加对应的路径即可,如:os.path.join(BASE_DIR,'templates')

##Template与视图的绑定

通过from django.shortcuts import render模块

return render(request,template_path,{k:v})字典中的key和value就是要向前端渲染出的数据

##Template展示渲染的数据

在html以{{}}为标示,在双大括号中传入视图中传入的数据

##Template内置标签与静态文件配置

变量与标签

变量用{{}}双大括号包裹,比如我们后端渲染过来的数据,用双大括号来包裹,列如{{name}}
内置标签类型,用{% %}大括号 左右各一个百分号包裹

内置标签

1
2
3
4
5
6
7
8
9
标签&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;介绍
{% for %} {% endfor %}&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;遍历输出的内容
{% if %} {% elif %} { % endif %}&emsp;&emsp;对变量进行条件判断
{% url name args %}&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;引用路由配置名
{% load %} &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;加载django的标签库
{% load static %}&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;读取静态资源
{% extends base_template%}&emsp;&emsp;&emsp;模板继承
{% block data %} {% endblock %}&emsp;重写父模板的代码
{% csrf_token %}&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;跨域的 密钥

###for标签模板
变量             说明
forloop.counter       从1开始计算获取当前索引
forloop.counter()      从0开始计算获取当前索引
forloop.revcounter      索引从最大数递减到1
forloop.revcounter()      索引从最大数递减到0
forloop.first         当前元素是否是第一个
forloop.last         当前元素是否是最后一个
empty           为空的情况

静态文件的配置

项目根目录创建’static’与’templates’文件夹同级
STATICFILES_DIRS=(os.path.join(BASE_DIR,’static’),)

哪些是静态文件

Css样式文件
Javascript文件
Image图片文件等

模板内置过滤器

过滤器的用处
用于在html模板中,对于渲染过来的数据进行二次操作使用,过滤器其实就是用来处理这些数据的模板引擎中使用的函数

常用的过滤器介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
内置过滤器函数&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;使用方法&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;说明
add&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|add:10}}&emsp;&emsp;&emsp;&emsp;给value的值加10
date&emsp;&emsp;&emsp;&emsp;&emsp;{{value|data:"Y-m-d H:i:s"}}&emsp;&emsp;&emsp;&emsp;把日期格式按照规定的格式化显示
cut&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|cut:' xx '}}&emsp;&emsp;&emsp;&emsp;将value中的xx删掉
capfirst&emsp;&emsp;&emsp;&emsp;&emsp;{{value|capfirst}}&emsp;&emsp;&emsp;&emsp;value首字母大写
default&emsp;&emsp;&emsp;&emsp;&emsp;{{value|default:“ xx ”}}&emsp;&emsp;&emsp;&emsp;值为false时使用默认值
default_if_none&emsp;&emsp;&emsp;&emsp;{{value|default_if_none:" xx "}}&emsp;&emsp;&emsp;&emsp;值为空时候使用默认值
dictsort&emsp;&emsp;&emsp;&emsp;&emsp;{{value|dictsort:"key"}}&emsp;&emsp;&emsp;&emsp;值为字典的列表,按照key排序
dictsortreversed&emsp;&emsp;&emsp;&emsp;{{value|dictsorteversed:"key"}}&emsp;&emsp;&emsp;&emsp;上边方法 反序
first&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|first}}&emsp;&emsp;&emsp;&emsp;返回列表中第一个索引值
floatformat&emsp;&emsp;&emsp;&emsp;{{value|floatformat:2}}&emsp;&emsp;&emsp;&emsp;保留小数点后2位
join&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|join:" xx "}}&emsp;&emsp;&emsp;&emsp;类似python' xx'.join(value)
last&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|last}}&emsp;&emsp;&emsp;&emsp;返回列表最后一个索引值
length&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|length}}&emsp;&emsp;&emsp;&emsp;返回值的长度
divisibleby&emsp;&emsp;&emsp;&emsp;&emsp;{{value|divisibleby:2}}&emsp;&emsp;&emsp;&emsp;如果可以被2整除返回true
length_is&emsp;&emsp;&emsp;&emsp;&emsp;{{value|length_is:"2"}}&emsp;&emsp;&emsp;&emsp;如果长度是2返回true
safe&emsp;&emsp;&emsp;&emsp;&emsp;{{value|safe}}&emsp;&emsp;&emsp;&emsp;将字符串中的html标签在前端安全显示
random&emsp;&emsp;&emsp;&emsp;&emsp;{{value|random}}&emsp;&emsp;&emsp;&emsp;随机列表中的一个值
slice&emsp;&emsp;&emsp;&emsp;&emsp;{{value|slice:" :2 "}}&emsp;&emsp;&emsp;&emsp;截取前两个字符
slugify&emsp;&emsp;&emsp;&emsp;&emsp;{{value|slugify}}&emsp;&emsp;&emsp;&emsp;值小写,单词用-分隔
upper&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|upper}}&emsp;&emsp;&emsp;&emsp;字符串大写
urlize&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;{{value|urlize}}&emsp;&emsp;&emsp;&emsp;字符串中链接可点击
wordcount&emsp;&emsp;&emsp;&emsp;&emsp;{{value|wrodcount}}&emsp;&emsp;&emsp;&emsp;字符串中单词数
timeuntil&emsp;&emsp;&emsp;&emsp;&emsp;{{value|timeuntil}}&emsp;&emsp;&emsp;&emsp;距离当前日期的天数和小时数(未来)

## 自定义过滤器

在django服务器端编写函数,在模板中可以直接调用的过滤器函数

定义自定义函数规则

在应用下创建templatetags文件夹
在文件夹下创建myfilter.py

自定义举例

from django import template
register = template.Library()# 自定义过滤器
@register.filter
def test_filter(value,args):
return value + args

{% load myfilter %}
{{data|test_filter: 3}}

其它常用模板介绍

###Jinja2
Jinja2是一套模仿Django模板的模板引擎,由Flask开发者开发,它的使用场景和Django的模板非常相似,它速度快,被广泛使用。
Jinja2提倡让Html设计者和后端Python开发工作分离
http://jinja.pocoo.org/docs/2.10/

###Mako
mako模板算是python里面比较出色的一个模板了,它宣称有比Jinja2更快的解析速度已经更多的语法支持
最大的特点在于,它可以允许你在Html中随意书写python代码


#Model层
##ORM与Django的Model基础知识
###什么是ORM
全称:object relational mapping,通过使用它,我们可以直接使用python的方法去使用数据库

通过把表映射成类,把行作为实例,把字段作为属性,orm在执行对象操作的时候会把对应的操作转换成数据库原生语句的方式来完成数据库开发工作

###ORM的优点
1、使用简单,通过将数据库语法进行封装,直接使用方法即可操作数据库。
2、性能好,在通过orm转换成sql的时候会有一些消耗,但这个消耗其实非常低,在对整体业务提升的角度说,这点消耗可以忽略不计,除非你对于io操作要求非常的极端。
3、兼容性好,支持目前市面上多数的关系型数据库,如mysql prestresql salite等

###Django的ORM
Django中虚拟对象数据库也叫模型,通过模型实现对目标数据库读写进行操作,实现如下:
1、在settings.py中设置数据库信息(需提前在数据库中创建库)
2、在应用app的models.py中以类的形式定义模型
3、通过模型在目标数据库中创建对应的表
4、在视图函数中通过对模型的操作实现目标数据库的读写操作

###Settings中的数据库配置
DATABASES={
‘default’:{
‘ENGING’:’django.db.backends.mysql’,
‘NAME’:’blog’,# 你的数据库名称 数据库需要自己提前建好
‘USER’:’root’,# 你的数据库用户名
‘PASSWORD’:’’,# 你的数据库密码
‘HOST’:’’,# 你的数据库主机,留空默认为localhost
‘PORT’:’3306’,# 你的数据库端口
}
}

###Models层的书写
在models.py
from django.db import models

class Test(models.Model):
name=models.CharField(max_length=20)

同步数据库

Python manage.py makemigrateions在migrate文件夹下生成initialpy脚本文件

Python manage.py migrate将initialpy脚本中的代码执行,生成相对应的数据表

创建数据库和Django

首先mysql -uroot -p进入,输入我创建的密码root,然后create database lession4创建一个lession4的库,然后use lession4;看一下,然后show tables;看一下为空,然后exit退出进入虚拟环境。

Django的创建:django-admin startproject one,然后cd进入目录,然后输入python manage.py startapp app创建app。

Settings配置:
首先在INSTALLED_APPS = []里注册app。
然后配置:
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘lession4’,
‘USER’:’root’,
‘PASSWORD’:’root’,
‘HOST’:’127.0.0.1’,
‘PORT’:’3306’,

}

}
然后在终端输入命令:python manage.py makemigrations,app内migrations目录内会生成一个0001_initial.py文件,然后这时还没有同步到mysql,还需要执行命令:python manage.py mirgrate,然后再通过上面的mysql命令进去查看会多了很多表,然后show查看之后,可通过desc xxx;查看这个表内容,查看这个表如何创建:show create table xxx。

###Model列方法与属性