文章目录
1. Django工作原理(请求的生命周期)
1.用户通过浏览器请求一个页面(发送http请求);2.请求到达request Middlewares中间件,中间件对请求做预处理或者直接发送response请求;
3.通过urls.py文件和请求的URL找到相应的view;
4.访问view Middlewares中间件,可以对request做一些处理,或者直接返回response;
5.执行(调用)view中的函数;
6.view中的方法可以选择性的通过models访问底层的数据;
7.输出被返回到view;
8.HTTPResponse被发送到Response Middlewares,Response Middlewares可以丰富返回的内容或者返回一个完全不同的Response;
9. 将Response返回到浏览器,呈现给用户。
2. Django项目中的目录结构
1.创建Django项目mgCRM,项目根目录下会生成同名的项目文件夹mgCRM,该目录下的文件内容 如下:|--mgCRM
|------|-- __init__.py :用来告诉python,当前目录是python模块
|------|--settings.py:包含整个项目的配置参数
|------|--urls.py:URL根配置,作为路由分发使用
|------|--views.py:根据业务逻辑,不需要时无需增加,做根url请求的业务逻辑处理
|------|--wsgi.py:内置的runserver命令的wsgi配置
2.创建Django项目同时生成manage.py文件,整个项目的管理使用文件;
3.创建app文件夹crm,主要做完整模块功能的开发,目录结果如下:
|--crm
|------|--__init__.py:告诉python这是个python模块,或者为当前app做些初始化设置
|------|--admin.py:用于注册使用Django提供的后台管理admin中的数据表
|------|--apps.py:app配置
|------|--models.py:用于写生成后台数据库表的类
|------|--test.py:测试文件
|------|--urls.py:主要做app内部路由分发
|------|--views.py:主要做app内部的业务处理,并给出需要的返回值
创建app时需要注意settings.py文件中是否有配置该app。
4.创建statics文件夹,该文件夹中用于存放静态文件,具体可用如下目录来划分:
|--statics(文件夹)
|------|--css(文件夹):存放调用的css样式文件
|------|--js(文件夹):存放调用的js文件
|------|--imgs(问价夹):存放项目中使用的图片文件
|------|--fonts(文件夹):存放某些字体的文件
在创建statics文件后需要在settings.py文件中做下配置,否则在寻址时找不到statics文件夹以及文件夹下的文件,配置如下 :
STATIC_URL='/static/'
STATICFILES_DIRS=(os.path.join(BASE_DIR,'statics'),)
5.创建templates文件夹,该文件夹用于存放模板文件(HTML文件),若项目的app比较多的话,可以考虑在此文件夹下建立对应的app模板文件夹,用于明确区分不同app使用的HTML模板文件。3. Django中常用的命令
[1] django-admin startproject project_name 创建项目名为 project_name的项目;[2] python manage.py startapp app_name 创建app名为app_name的app;
[3] python manage.py makemigrations models.py建表命令第一步,创建更改的文件,生成迁移文件;
[4] python manage.py migrate models.py建表命令第二步,将生成的py文件应用到数据库,执行迁移文件;
[5] python manage.py createsuperuser 创建admin超级用户;
[6] python manage.py changepassword username 修改用户密码;
[7] python manage.py runserver 端口号 开启开发环境对应端口的服务;
[8] python manage.py flush 此命令会询问yes/no,选择yes会把数据全部清掉,只留下空表;
[9] python manage.py dumpdata appname > appname.json 导出数据;
[10] python manage.py loaddata appname.json 导入数据;
[11] python manage.py shell 此命令会自动配置一些环境需要的变量,可以直接在终端调用当前项目models中的API,对于操作数据比较方便。
更多命令使用可使用终端输入python manage.py查看。
4. Django中的csrf验证原理及作用
CSRF(Cross Site Request Forgery)跨站点伪造请求。例如,某个恶意网站上有一个指向你的网站的链接,如果某个用户已经登录当你的网站上,这个时候用户去点击恶意网站上的这个链接时,就会向网站发来一个请求,你的网站则会认为这是用户自己发来的,其实这个请求是恶意网站伪造的。CSRF攻击之所以能够成功就是因为攻击者可以伪造用户请求,该请求中所有的用户验证信息都存在于cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过安全验证。 django中为用户实现防止跨站请求伪造的功能,通过中间件django.middleware.csrf.CsrfViewMiddleware来完成。在django中设置防跨站请求伪造功能分局部和全局。全局
中间件 django.middleware.csrf.CsrfViewMiddleware
局部
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即使settings中没有设置全局中间件;
@csrf_exempt,取消当前函数防跨站请求伪造功能,即使settings中设置了全局中间件。
django中csrf防护原理
在用户访问django的 可信任站点时,django反馈给用户的表单中有一个隐藏字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值,当用户提交这个django表单时,服务器校验这个 表单的 csrftoken是否和自己保存的一致,来验证用户合法性。当用户被csrf攻击从其他站点发送伪造请求时,由于不知道隐藏的csrftoken字段信息从而无法通过浏览器的校验,攻击被防御,这样就防止了跨站请求伪造攻击。
1.在返回的HTTP响应的cookie里,Django会自动添加一个csrftoken字段,其值为一个自动生成的token;
2.在所有的post表单时,必须包含一个csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag,django 就会自动帮你生成);
3.在处理post请求之前,Django会验证这个请求的cookie中的 csrftoken字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden。
4.在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值。
Django中使用的csrf防护
1.GET 请求最好不要用。任何处理 GET 请求的代码对资源的访问都一定要是“只读“的。
2.启用 django.middleware.csrf.CsrfViewMiddleware 中间件。
3.使用POST 表单元素时,加上{% csrf_token %}。
4.渲染模块使用 RequestContext。RequestContext 会处理 csrf_token , 从而自动为表单添加一个名为 csrfmiddlewaretoken 的 input。
5. Django–ORM
什么是ORM?ORM(关系对象映射)。在django中,根据代码中的类自动生成数据库的表。
类名对应--------------------》数据库中的表名
类属性对应-----------------》数据库里的字段
类实例对应-----------------》数据库表里的一行数据
obj.id,obj.name------------》类实例对象的属性(obj是类的一个实例,对应数据库一行数据,id,name对应这一行数据的两个列值)
Django的orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心底层用的是MYSQL,QRACLE等等,如果数据库迁移,只需要更换Django的数据库引擎即可。
Django连接MYSQL数据库
修改project中的__init__.py文件设置django默认连接mysql的方式
import pymysql
pymysql.install_as_MySQLdb()
在settings文件中配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'db1',#数据库名称
'USER': 'root',#对应数据库用户名
'PASSWORD': '123123',#密码
'HOST': '192.168.10.235',#数据库地址
'PORT': '3306',#端口号,mysql默认的是3306
}
}
models.py文件中常见的数据类型写法●AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性;
●BooleanField:布尔字段,值为True或者False;
●NullBooleanField:支持NULL,True,False三种值;
●CharField(max_length=字符长度):字符串;
●TextField:大文本字段,一般超过4000个字符时使用;
●IntegerField:整数;
●DecimalField(max_digits=None, decimal_places=None):十进制浮点数;
●FloatField(max_digits=None, decimal_places=None):浮点数;
参数max_digits表示总位数;
参数decimal_places表示小数位数。
●DateField(auto_now=False, auto_now_add=False):日期;
●TimeField(auto_now=False, auto_now_add=False):时间;
●DateTimeField(auto_now=False, auto_now_add=False):日期时间;
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false;
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
●FileField:上传文件字段;
●ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
关系
1.一对一关系
models.OntoOneField():定义在哪一个类都可以;
2.一对多关系
models.ForignKey():外键约束,定义在多类中;
3.多对多关系
models.ManyToManyField():定义在哪一个类都行。
参数
●null:如果为True,表示允许为空,默认值是False,null是数据库范畴的概念;
●blank:如果为True,则该字段允许为空白,默认值是False,blank是表单验证证范畴的;
●db_column:字段的名称,如果未指定,则使用属性的名称;
●db_index:若值为True, 则在表中会为此字段创建索引,默认值是False;
●default:默认值;
●primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用;
●unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
6. Django–admin
Django中的admin提供后台管理功能。基于admin模块可以实现类似数据库客户端的功能,对数据进行增删改查,基于该模块的数据管理功能,可以二次定制一些实用功能。使用方法:
步骤一:在settings.py中INSTALLED_APPS中,加入django.contrib.admin
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth', #admin依赖
'django.contrib.contenttypes', #admin依赖
'django.contrib.sessions', #admin依赖
......
]
步骤二:urls.py创建admin路由from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
....
]
步骤三 :在settings.py配置文件中,中间件注册MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
....
]
步骤四 :在admin.py中注册表from django.contrib import admin
# Register your models here.
from app01 import models
admin.site.register(models.userinfo)
admin.site.register(models.password)
步骤5:在admin.py中自定制class myAdmin(admin.ModelAdmin):
list_display = [] # 列表,定制显示的列
list_filter = [] # 列表,定制右侧快速筛选
search_fields = [] # 列表,根据哪些字段做搜索
list_display_links = [] # 列表,定制列可以点击跳转
list_select_related = [] # 列表,连表查询是否自动select_related
action #列表,定制action中的操作
list_editable = [] # 列表,定制可以编辑的列
search_fields = [] # 列表,定制模糊搜索的列
date_hierarchy = [] # 列表,对Date和DateTime类型进行搜索
preserve_filters # 详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件
save_as_continue = True # 点击保存并继续编辑
save_on_top = False # 详细页面,在页面上方是否也显示保存删除等按钮
inlines # 详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
raw_id_fields = ('id字段', 'name字段',) # 详细页面,针对id和name字段变成以Input框形式
fields = ('user',) # 详细页面时,显示字段的字段
exclude = ('user',) # 详细页面时,排除的字段
readonly_fields = ('user',) # 详细页面时,只读字段
ordering = ('-id',) # 以id列排序
show_full_result_count = True # 列表时,模糊搜索后面显示的数据个数样式
formfield_overrides = {} # 详细页面时,指定实现插件
prepopulated_fields = {} # 添加页面,当在某字段填入值后,自动会将值填充到指定字段
empty_value_display = "列数据为空时,显示默认值"
7. Django中搭建 radis缓存数据库
1.首先需要在服务器上安装redis数据库,详细安装过程如下:redis安装|菜鸟教程
2.安装django-redis和settings配置
pip install django-radis #django中安装redis数据库
settings.py中加入以下内容,my_host_ip换成你的服务器地址,mypassword换成你的服务器密码
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://my_host_ip:6379',#配置redis服务器地址和端口
"OPTIONS": {
"CLIENT_CLASS":"django_redis.client.DefaultClient",
"PASSWORD": "mypassword",#服务器密码
},
},
}
# 以下内容可以不设置
REDIS_TIMEOUT=7*24*60*60 #
CUBES_REDIS_TIMEOUT=60*60
NEVER_REDIS_TIMEOUT=365*24*60*60
8. Django中常用的模块及作用
模块名 | 作用 | 模块导入 |
---|---|---|
HttpResponse | 视图内写HTML直接打印 | from django.shortcuts import HttpResponse |
JsonResponse | 响应一个content-type:text/json 返回一个json响应报文,相应的浏览器端也不用在对json反解 | from django.http import JsonResponse |
redirect render | 第二次请求,url更新 只会返回页面内容,但是未发送第二次请求 | from django.shortcuts import render,redirect |
reverse | 视图内反向解析地址 | from django.urls import reverse |
path re_path | 访问地址 正则匹配访问地址 | from django.urls import path, re_path |
include | url分发给对应文件内的urls处理 | from django.urls import include |
register_converter | 自定义路径正则匹配注册功能 | from django.urls import register_converter |
auth | 组件 | from django.contrib import auth |
User | 自带用户管理 | from django.contrib.auth.models import User |
authenticate | 自带登录安全验证 | from django.contrib.auth import authenticate |
login logout | 自带登录/注销 | from django.contrib.auth import login,logout |
forms | 组件forms | from django import forms |
widgets | 小工具,窗体小部件 | from django.forms import widgets |
ValidationError | django的异常定义都在django.core.exceptions模块中,该异常用于自定义钩子 | from django.core.exceptions import ValidationError |
ModelForm | 如果一个form的字段数据是被用映射到一个django models.那么一个ModelForm可以帮助你节约很多开发时间。因为它将构建一个form实例,连同构建适当的field和field attributes,利用这些构建信息,都来自一个Model class | from django.forms import ModelForm |
send_mail | 邮件组件 | from django.core.mail import send_mail |
models F, Q AbstractUser transaction | models组件 利用model做数据库的事务操作 | from django.db import models from django.db.models import F, Q from django.contrib.auth.models import AbstractUser from django.db import transaction |
paginator | 分页器 | from django.core import paginator |
View | 用于media访问内置视图 | from django.view import View |
MiddlewareMixin | 中间件 | from django.utils.deprecation import MiddlewareMixin |
template | 模板相关:自定义tag和filter需要用到 | from django import template |