(个人笔记)Django学习笔记整理

‘@’ 为遗漏点或者难点
‘#’ 为重点标记
'若有打眼,欢迎自取,错误之处,还请指教

    DAY 11.24
    
   @ url统一资源定位符限定有2到4kb 因为浏览器地址栏里只能输入这么多东西
    
    1,MVT
    2,观看中文文档
    3,学习重点 视图 模型
    4,i课件回顾。
    5,新建项目,在pycharm里新建项目 选择django框架,选择虚拟环境,
    workon meiduo  which python
    然后复制路径拷贝到虚拟环境选项。
    6,项目文件介绍。
    7,那啥是啥意思来着?就是需要定义路由规则?
    8,框架自带服务器和部署服务器的区别。  自带服务器是什么?
    9,setting是配置文件的原因是在manage文件中指定了配置命令,所以可以修改。
    10,创建应用,startapp  
              注册/安装 应用。
    11,contrib 提供的 
    12,试图函数必须有接受参数,表示请求对象。
    13, 配置路由规则。from . import views
    当前包引入视图模块
    14,url语法 ,第一个参数是争着表达式,第二个参数是试图模块里的视图函数名。
    @复习正则表达式
    abspath  绝对路径
    host=【】放的是域名
    15,前后端分离不用csrf,交给网站实现
    16,root_urlconf 指定根级路由文件 
    17, 模板文件配置信息 绑定了路径信息
    18, 指定wsgi
    19, 指定数据库
    20,auth 用户认证模块,做密码验证的 大概和注册部分的方式有关。
    21,指定静态文件按请求目录,改的时候要绑定文件路目录。
    @老师用的的啥输入法?答 五笔
    22,路由规则:
    url字符串:协议://域名:端口/路径/?查询字符串
    匹配过程  拿到url 找到路径部分 删除最左边的斜杠,与根级url进行按顺序匹配。
    匹配失败就返回404
    匹配成功 就删除成功的部分,留下剩余的部分如index/再与下一级的列表按顺序匹配,失败返回404 成功则返回结果。
    @与flask匹配区别,逐级匹配,不成功则不返回详细映射。
    
    位置参数和关键子参数的区别,在与返回的参数是否是按位置排列,或者按关键字参数排列?
    
    
    @匹配级别 怎么分的  根级包含的子级 有咩有会混淆的可能啊?感觉好乱啊
    23,django中设置路由规则不能以/开头,推荐/结尾。
     
    
    24,从request中拿数据,四种途径 就是四个信息方面。
          24.1 路径中:
    路径中对应的部分加括号,并且要再函数中加参数提取回来。
    @怎么知道别人给了几个参数?也就是怎么知道设置几个变量来接收/?
    Da:肯定知道参数名,因为客户端的请求是按前端定义好的参数格式发送的,不是手动输入的,是鼠标点的。
    @正则表达式可以直接按位置再url里命名。
    
    url(r'^a/([a-z]+)/(\d{4})/$', views.a),
    def a(request, city,year):
        print('city=%s' % city )
        print(year)
        return HttpResponse('ok')
    
    url(r'^b/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.b),
    def b(request, year, city):
        print(city)
        print(year)
        return HttpResponse("ok")
         24.2 查询字符串
    路径后面以?开始 &连接的字典形式的参数就是查询字符串。
    获取用GET.get 
    
    url('^get1/$',views.get1)
    
    def get1(request):
        dict1 = request.GET
        print(dict1)
        print(dict1.get('a'))
        return HttpResponse(dict1.get('a')
    
    
    怎么获取指定参数?肯定知道参数名,因为客户端的请求是按前端定义好的参数格式发送的,不是手动输入的,是鼠标点的。
        24.3 请求报文体 json等
    表单类型的数据:request.POST
    重要:只要请求体的数据是表单类型,无论是哪种请求方式(POST、PUT、PATCH、DELETE),都是使用request.POST来获取请求体的表单数据
    非表单数据:request.body 返回json格式数据。
    @用postman模拟post a=10
    @json格式的数据构造必须是“”双引号才能解析。是postman的问题。  获取用request.body 并转换数据。
    步骤为,1 接受byte类型数据 byte
                   2 转换为字符串dir =  byte .decode
                   3 (导入json包)转换为字典x'husn'husn'wei json.loads(dir)
        24.4 请求报文头 mehtods
    request.属性 常用的有
    request.method
    request.path
    request.user  当前用户  登陆用户或者游客。
    @上面获取参数的意思是 这些东西为以后写接口做准备。
    25,返回jsonresponse格式数据 return JsonResponse({字典格式的数据})括号里写数据。
    如果不是json格式数据,设置字典的value值为  safe=False
    @其实括号里有两个参数  一个json数据 一个safe  默认true 所以不是字典就用false。
    @无论如何返回的是json格式的数据。
    
    def json1(request):
        # request.body===>接收请求体中的非表单数据,常用格式为json,类型为bytes
        str1 = request.body.decode()  # 转字典串
        # 将字符串转字典
        # json.dumps()===>字典转字符串
        # json.loads()===>字符串转字典
        dict1 = json.loads(str1)
        print(dict1.get('a'))
        return HttpResponse('OK')
    
    ------状态保持-----
    26,cookie 键值对方式存在浏览器中,
    写法 response.set_cookie('','',max_age='')
    def cookie_set(request):
        response = HttpResponse('OK')
        response.set_cookie('a', 10, max_age=7 * 24 * 60 * 60)
        return response
    
    读取 request.cookies.get('key')
    
    def cookie_get(request):
        a = request.COOKIES.get('a')
        print(a)
        return HttpResponse('OK')
    
    27,状态保持之session
    保存在redis里  复制过来 必须有一项default
    保存在缓存中  再保存到redis中。
    如果存成一样的东西 记得手动分开。
    @将caches设置成动态模板!!
    写法:request.session['hello']='django'
    
    def session_set(request):
        # request.session['a'] = 10
        request.session['b'] = 20
        return HttpResponse('OK')
    
    读取:request.session.get(‘hello’)
    
    def session_get(request):
        print(request.session.get('a'))
        return HttpResponse('ok')
    
    删除 1  :del request.session(''key)
    删除2 : request.session.clear()
    删除3: request.session.flush()
    def session_del(request):
        # del:将指定的键、值进行删除
        # del request.session['b']
    
        # clear:将所有的键、值删除
        # request.session.clear()
    
        # flush:删除整条数据
        # request.session.flush()
    
    
    
    28,session加密存储的信息是将key和值整体加密存进redis中的,不是分开存的。
    @session默认过期时间是2周。
    @cookie默认过期时间是关闭浏览器。
    @session 依赖与cookie。
    
        return HttpResponse('OK')
    29,类视图  实现请求方式不一样的时候返回视图不一样。  并实现代码继承和复用。
    
    class ShowView(View):
        def get(self, request):
            return HttpResponse('get')
    
        def post(self, request):
            return HttpResponse('post')
    
    
    def show(request):
        if request.method == 'GET':
            return HttpResponse('get')
        elif request.method == 'POST':
            return HttpResponse('post')
    
    」
    —————————
    
    DAY 11.25
    昨日总结:
    
    今日记录:
    1,session 当作字典用就好了
    2,类视图的as_view方法 是源码带的
    他内部定义一个函数并返回了一个函数。所以路由规则里写的也是满足规则的一个函数
    url('^.....view......as_view)
    3,dispatch 派遣调度。
    -----
    100 continue 继续发送
    101 switch 转换协议
    
    200 ok
    
    301 moved permanently 重定向了
    
    400 badrequest 不能解析
    401 unauthorized  要求登陆
    403 forbidden 禁止访问
    404 notfound 定向失败
    405 methods notallowd 请求方法不允许
    406 not acceptable 客户端无法接收
    410 请求页面丢失
    
    
    500 internal server error 服务器未知错误
    501 not lmplenmented 服务器不支持请求
    502 bad gateway  服务器网关无效
    504 gateway timeout 网关超时
    505 httpversion not supported 服务器不支持请求的协议版本
    -------------
    4,getattr 获得属性
    类视图 就是根据据请求方法找方法然后执行。
    
    5,类视图使用装饰器。再内部最先执行的函数钱加装饰器。  这里用的是dispatch()(也有get  post等已经执行的方法)
                 也可以导入utils 导入类装饰包
    @method_decorator(wrapper1,name='dispatch')
    6,扩展功能类 以***Mixin结尾  表示功能类  用于特定的功能的封装。 
    使用方法,写个类继承他一下。
    
    7,中间件 
     7.1 是什么  相当于请求钩子,为了给所有的试图函数加上一定的功能。功能类似于一个装饰器。比装饰器更装饰器!!中间件可以包含装饰器。
    7.2 选择标准,看装饰的对象的多少。如果大部分需要装饰,可以用中间件然后排除掉不用装的视图,就是做if判断。
    7.3 定于语法与装饰器相同
    7.4 注册到setting中,middleware
    7.5 排除写个if判断
    7.6 中间件的执行顺序:按照注册顺序,以试图函数为分界,先进后出。
    
    8,模板 templates决定这么文件路径的关键是已经在setting里注册了
    return里面的参数:1 request, 2 xx.html 3,字典参数
    并在html里接受字典的key进行渲染。
    @注意与jingja2里不一样的语法指出是 运算符左右各有一个空格。
    @过滤器参数冒号后面加  
    
    @复习 输出直接{
  { 变量 }}
                运算{% 函数 %}
    @自定义过滤器 与jinja2类似 看下文档。
    ----------------------
    9,数据库  的orm  对象关系映射
    安装包pymysql,
    9.1 在项目同名文件夹下的init文件中,
    import pymysql
    pymysql . install_as_MySQLdb()
    @解释 就是pymysql升级了  但是django中没有升级内部接口名称,执行后就相当于把pymysql 当作MySQLdb用。
    
    9.2  需要在注册在数据库配置中
    参数:DATABASES = {复制一下}
    
    10,定义模型类。
    在应用的model下定义模型类
    语法:
    class ***(models.Model):
    各种语法:复制
    默认主键
    默认表名
    明确定义的属性 和隐含的属性
    (BookInfo, related_name = '自定义属性名’)
    
    @自关联一对多 多对多等关系
    @onotoone等
    
    11,数据库迁移
    两行命令 1 makemigrations 生成迁移文件。
                2   migrate 执行迁移文件
    12, 进入shell惊醒数据库的增删改查
    @执行记录查询语句的配置  相当于echo语句打印吧
    12.1,语法一:
         objects.create()
    创建完成后需要用浏览器执行?
      语法2:
    book = BookInfo()
    book.btitle='abc'
    ..
    ..
    book.save()
    save执行了update然后insert
    @比语法一复杂。 一般用于用户加密后存入数据库。
    然后post执行???
    @浏览器执行相当于什么???
    12.2单条件 查询
    get 单一对象
    all() 查询全部 一般返回给模板遍历。要结合条件查询
       filter 满足条件
      exclude 满足的排除
      det过滤单一结果。
    @语法 属性名称__比较运算符 = 1等于值 id__exeat=1  | id = 1
    2包含  contents
    3 以什么开头 startwith
    4 以什么结尾endwith
    @@@前面加上I是表示不区分大小写。
    5,isnull  = false 或者ture
    6,范围 in  1,3  表示或  不是在        1,3 之内
    7, 不等于3  exclude(id = 3)
    8,对日期做运算:__year = 1980  发布日期为1980年的书。
    9, 日期比较大小  gt=1980.1.1
    大于1980.1.1的日期。」
    —————————
    
    
    DAY 11.27
    
    昨日总结
    1,复习,创建 模型;
    	1:模型类.object.create(属性1=值1)
    	2:对象类型=模型类()
    2,查询:
    	模型类.object.方法(属性_运算符=值)
    	方法:
    	运算符.
    3, F 对象 对象的属性:
    	F('属性名称') 可以让属性和属性比较,而不是直接属性值来比较,就是变量与变量比较.  
    	bread__gt=F('bcomment') * 2 
    4,Q对象 ,为了连接多个条件语句
    	fillter(Q(bread__gt=20)&Q(pk__lt=3))
    	@pk 表示primary key  上那么主键都可以用.
    5, 逻辑与 & 可以用,代替.
    6, 逻辑或 | ===>管道连接
    7, 逻辑非 ~ ====>对Q对象取非.
    8, aggregate 聚合函数 后面还有che类型
    	aggregate(sum())
    	返回的shug是字典类型数据
    9,count 
    10, 排序  :order_by 以什么排序 默认升序.
    	降序前面加 - 减号
    11, 没有查询分页方法 使用的是一个类方法.
    12, 关联查询:??????
    	使用对象访问:对象,和属性
    	查询语句,对象_属性_运算符 = 值
    	
    13, 修改
    	put方法
    14, 删除方法 deleat逻辑删除
    15, 查询集:调用all() filter() ,exclude()
    order_by() 返回查询集
    	俩个特性 :1,惰性执行
    			2,缓存,减少与mysql交互,迅速.会根据代码实现.
    
    16,admin 后台管理.
     16.1 创建管理员:
     16.2 注册模型类:
     16.3 修改中文  类属性增 verbors_name
    17, 后台管理 之
    	17.1 增删改差
    	17.2 增加后台属性 定义一个类然后作为注册的属性传入修改效果.
    	17.3 strftime  日期转字符串.
    		 strptime  字符串转换日期格式.
    	17.4 list_display 列表页面显示什么方法
    	17.5 list_filter 列表页面以什么过滤
    	17.6 search_fields 列表页面搜索选项. 需要指定搜索范围.
    18, 编辑页的属性修改
    	fields=[属性名称]  设置编辑页面的属性
    	用于编辑页面的高级修改  就跟设置某些页面的高级选项一样.  不写的属性不会显示.
    	fieldsets=(
    		('组名',{'fields':[属性名])
    		('组名',{'fields':[属性名)	
    	)
    
    19, 内嵌类  定义类 加参数 然后在书籍列表嵌入英雄.   可以给书籍列表增加修改项目 
    	列表新式内嵌 和 form表单新式内嵌.
    20, 后台页面的标题  
       3个  标签标题
    		首页标题
    		主页标题
    
    21, 上传图片.文件保存在磁盘  名字或者地址保存到数据库.
    	1,完成配置,创建目录,配置地址.
    	2,模型类中定义属性,ImageField
    @需要数据库迁移,需要文件copy   ???如果不copy的话会怎么样?
    @需要在medie下新建保存库.
    	3,如果需要管理编辑在admin下的管理模型下面还要注册新增类.
    	@图片保存路径构造: media/
        4, 访问需要注册文件目录.
    	
    
    DAY 11.28
    
    昨日总结
    
    数据库操作
    	增加:
    		对象=模型类.objects.create(属性1=值1,...)
    		创建对象,属性赋值,对象.save()
    	查询
    		模型类.objects.方法(属性__运算符=值)
    		方法:all()===>不能写参数
    			filter(),get,exclude()====>写查询条件
    			order_by(),aggregate()
    		类型:F(属性)
    			Q(条件语句)==》实现逻辑与&、或|、非~
    			说明:逻辑与可以通过逗号连接
    	修改
    		模型类.objects.filter(条件).update(属性1=值1,...)
    		查询对象,修改属性,对象.save()
    	删除
    		模型类.objects.filter(条件).delete()
    		查询对象,对象.delete()
    
    @还没写到admin  写到了  但是迁移不了数据库
    
    @后台管理admin
    	1.创建管理员
    	2.在应用的admin.py中注册模型类
    		class ***Admin(admin.ModelAdmin):
    			重写属性,实现页面效果
    		admin.site.register(模型类,***Admin)
    	3.在后台中可以完成数据的增加、修改、删除、查询
    
    @repr 和str 方法显示字符串
    
    @shell(输入python)输出对象时会执行这个对象的repr方法
    
    @在终端输出 比如pycharm里输出的那个终端使用str的方法.
    
    @ shell  计算机解释器界面
    今日笔记
    1,DRF Django REST framwork
    2, web应用模式 :
    	前后段不分离 接受数据 处理数据 返回数据
    	前后段分离  处理数据返回数据  返回json
    区别在与试图负责的工作,  不分离的试图负责调用模板 生成html返回.  分离的试图负责构造json返回数据. 
    3, RESTful 设计方法.
        一般写接口就是尽量在一个类中定义不同方法.遵守规范. 这个规范即使RESTful规范.
        含义:规定编写接口的规则:    
        1,应用域名尽量体现api
        2, 版本信息体现.
    
    @案例
    图书
    	操作:crud
    	定义视图:get,post,put,delete
    	路由规则:一条
    英雄
    	操作:crud
    	定义视图:get,post
    	路由规则:三条
    -----------与代码有关部分-------------
        3, 路径:名词 复数 原则.
        4,HTTP动词都是请求方法  所以和路径区别开了.
    	常用四个  模型类的方法
               GET () 查寻 无数据也是get方法
               POST ()  新建
               PUT  () 修改
               DELETE ()  删除
       	不常用四个 PATCH ()
       			HEAD  ()
       			OPTIONS () 
         5,
         6,状态码 
           200 ----ok          
           201 ---- created    创建成功
           204 ---- no content 无返回值 删除成功
           
           301 ----moved permanently
           
           400 ----bad request
           403 ----forbidden
           404 ----not found
           406 ----methods not allowd
          7,处理异常
          8,返回结果
          增删改查要返回结果.
          
          9, 超媒体 API的文档信息 让前端或者用户阅读.
          10, 数据格式 json格式 
    -----------------------------------
    
    3,代码实现
    请求方式   处理         路径            响应      状态码
    get ------查询--------books/----------json-------200
    post-----
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值