Django开发

Django中文文档   HTTP原理  redis命令参考

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
includeurl分发给对应文件内的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组件formsfrom django import forms
widgets小工具,窗体小部件from django.forms import widgets
ValidationErrordjango的异常定义都在django.core.exceptions模块中,该异常用于自定义钩子from django.core.exceptions import ValidationError
ModelForm如果一个form的字段数据是被用映射到一个django models.那么一个ModelForm可以帮助你节约很多开发时间。因为它将构建一个form实例,连同构建适当的field和field attributes,利用这些构建信息,都来自一个Model classfrom 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值