django2

   HTTP协议:
      四大特性:
         1.基于TCP/IP作用于应用层之上的协议
         2.基于请求响应
         3.无状态
         4.无连接
      
      数据格式
         请求:
            请求首行GET  url HTTP/1.1
            请求头(一大堆k,v的键值对组成)
            \r\n
            请求体
         
         响应:
            同上
      响应状态码
         1XX:服务器已接收到你的数据正在处理,你可以继续提交数据
         2XX:请求成功,返回相应数据
         3XX:重定向
         4XX:请求不存在(404)
         5XX:服务器错误
   
   
   借助于wsgiref模块帮我处理socket以及http消息的处理
      返回字符串
      返回一个html页面
      html页面展示当前时间(html文件r模式打开就是一堆字符串,利用字符串的替换完成后端朝前端html"传输数据")
      
   借助于jinja2帮我们完成模板渲染(后端给html页面传输数据)
      render()
      
   模板语法
   {{}}  变量相关
   {%%}  逻辑相关
      {{ data }}
      {{ data.name }}
      {{ data['name'] }}
      {{ data.get('name') }}
      
      {% for user_dict in user_list%} [{},{},{}]
         {{ user_dict }}
      {% endfor %}
   
   pymysql连接数据库
   
   
   
   动静态网页:
      静态网页:数据是写死的,万年不变
      动态网页:数据是后台动态获取到的,比如数据库的数据
      
   
   python三大主流web框架
   django
   flask
   tronado
   
   
   django框架
      django版本的问题
      
      安装
         命令行安装
            pip3 install django==1.11.11
         命令行创建django项目
            django-admin startproject '项目名'
               这样创建出来的django项目只有
                  一个项目文件夹
                     __init__
                     settings
                     urls
                     wsgi
                  manage.pycharm安装
         命令行创建创建app应用
            python manage.py startapp '应用名(app01)'
         命令行启动django项目
            python manage.py runserver 
            
            crtl+c
            
         pycharm安装
            new project 选django 注意选你的解释器(本机),可以在直接写app名帮你自动创建一个app
            
            应用下的
               migrations      数据库记录相关
               models.py     数据库模型表(ORM)
               views.py        视图函数(执行相关功能的)
               
            项目名下
               __init__.py
               settings.py       项目配置文件(欠你们django settings源码)
               urls.py         路由与视图函数的对应关系
               wsgi.py         wsgiref相关
               
            manage.py        项目入口文件
   
   
         HttpResponse   返回字符串
         render       渲染页面并返回
         redirect      重定向(可以写别人的网址也可以写自己的路由)
   
   from django.shortcuts import render,HttpResponse,redirect
   
   操作数据展示图书信息
      pymysql连接数据库
   
   
今日内容
   app概念
      一个大学有多个学院
      选课系统(学生 老师 管理员)
      优酷系统(普通用户 会员 管理员)
   写一个登陆功能
      
   pycharm连接数据库
   django里面的orm
   orm简单操作
   
   
   前端页面两种引入外部资源的方式
      CDN 内容分发网络
      加载本地文件
   
   html文件夹约定俗成的放在templates文件夹下
   TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
   
   约定俗成的静态文件都在放在static文件夹下
   一般情况下static文件夹下建议分成css,js及其他相关文件夹实现分层
   django静态文件配置
      STATIC_URL = '/static/'
      # 静态文件路径配置
      STATICFILES_DIRS = [
         os.path.join(BASE_DIR,'static'),
         os.path.join(BASE_DIR,'static1'),
         os.path.join(BASE_DIR,'static2'),
      ]
   
   form表单两种提交方式
      一种是input type=submit
      一种是button按钮
      
      form表单默认是get请求
      参数携带方式
      http://127.0.0.1:8000/login/?username=jason&password=123
      可以通过method参数指定提交方式
      
      action三种指定数据提交路径的方式(******)
         1.全路径 :http://127.0.0.1:8000/login/
         2.后缀:/login/(推荐用这种)
         3.不写:不写默认往当前路径提交
      
   通常情况下视图函数处理的都是get请求    
   def login(request):
      # print('收到了')
      # print(request.method)
      if request.method == 'POST':
         # 专门写post请求所对应的逻辑
         return HttpResponse('收到了!')
      # 直接写所有get请求所对应的逻辑
      return render(request, 'login.html')
   
   
   
   
   get请求和post请求
   
   django获取前端请求方式
      request.method
   
   
   获取get请求提交的数据
      request.GET 携带了前端所有get请求的数据
      username = request.GET.get('username')
      password = request.GET.get('password')
      取值遵循字典取值 注意虽然它的value是列表但是你取的时候默认取列表最后一个元素
   
      如果想获取列表里面所有的参数需要用
      getlist() 重点*******          应用场景  checkbox 多选的select框   
   
   获取post请求提交的数据
      request.POST 携带了前端所有get请求的数据
      username = request.POST.get('username')
      password = request.POST.get('password')
      取值遵循字典取值 注意虽然它的value是列表但是你取的时候默认取列表最后一个元素
   
      如果想获取列表里面所有的参数需要用
      getlist() 重点*******          应用场景  checkbox 多选的select框
      
   
   ORM
   什么是ORM
      对象关系映射:
         一个类                   >>>     数据库的一张表
         类的对象               >>>  数据库的一条记录
         对象点数据(user_obj.name)   >>>  数据库某条记录的某个字段值
   优点:
      不会写sql的程序员也能很溜的操作数据库
      大大提高了开发效率
      
   缺点:
      可能sql语句执行效率不高
   
   django连接mysql数据库
      1.配置文件注意点:变量名必须全部是大写,否则无效
      DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test007',
        'USER':'root',
        'PASSWORD':'123321',
        'HOST':'127.0.0.1',
        'PORT':3306
    }
}
      2.使用django orm它不会自动帮你创建库,需要你手动创建
      能帮你自动干的事:
            自动帮你创建表
   
   **********数据库迁移命令******************
   python manage.py makemigrations         这一句命令只是记录一下数据库更改记录
   python manage.py migrate            真正去操作数据库
   
   
   orm查询user表所有数据
      models.User.objects.all()
   orm查询user表的某条数据
      user_queryset = models.User.objects.filter(name=username,password=password)
   只有queryset对象才能够点query获取当前queryset对象所对应的sql语句
      user_obj.query 
      #  SELECT
        #             `app01_user`.`id`,
        #             `app01_user`.`name`,
        #             `app01_user`.`password`
        #  FROM
        #             `app01_user`
        #  WHERE
        # ( `app01_user`.`name` = jason AND `app01_user`.`password` = 123 )
   
   如果想获取对应的模型表对象,需要通过"索引取值"的方式,回去真正的数据对象  
   queryset支持正数索引取值,但是不推荐你直接用索引,推荐你用orm给你封装的first()
   user_obj = models.User.objects.filter(name=username,password=password).first()
   只有取出真正的模板表对象,才能通过点的方式操作对应数据库的某条数据
      
   
   
   表字段的增删改
      ******
      只要动了models.py中涉及表的代码,就必须重新执行数据库迁移命令
      缺一不可,切顺序不可颠倒
      python manage.py makemigrations         这一句命令只是记录一下数据库更改记录
      python manage.py migrate            真正去操作数据库
      
      
      表字段的新增
             # 对于已经有数据的表,新增字段的时候,要设置默认值
            addr = models.CharField(max_length=32,default='China')
            # 或者指定该字段可以为空
            phone = models.CharField(max_length=32,null=True)
      
      
   user表数据的增删改查
   查:
      后端
      def userlist(request):
      # 查询user表所有数据
      user_queryset = models.User.objects.all()
      return render(request,'userlist.html',{'user_list':user_queryset})  # 前端可以通过user_list拿到对应的数据
      前端
      # 模板语法之for循环 循环展示数据    可以直接敲for tab键自动补全for循环语法
      {% for user_obj in user_list %}
      <tr>
         <td>{{ user_obj.id }}</td>
         <td>{{ user_obj.name }}</td>
         <td>{{ user_obj.password }}</td>
         <td>{{ user_obj.addr }}</td>
         <td class="text-center">
            <a href="/edit_user/?id={{ user_obj.pk }}" class="btn btn-primary btn-sm">编辑</a>
            <a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger btn-sm">删除</a>
         </td>
      </tr>
      {% endfor %}
   删:
      def delete_user(request):
      # 获取被删除对象的id
      delete_id = request.GET.get('id')
      # queryset自带delete方法,删除queryset里面所有的数据对象
      # queryset调delete()执行的批量操作 删除的是queryset里面所有的数据
      affect_rows = models.User.objects.filter(id=delete_id).delete()
      print(affect_rows)
      return redirect('/userlist')
      前端
      <a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger btn-sm">删除</a>
   增:
      # 方式1:新增数据操作   返回值就是当前被创建对象本身
        # user_obj = models.User.objects.create(name=username,password=password,addr=addr)
        # 方式2:
        # user_obj = models.User(**request.POST)
      # user_obj.save()
   改:
      思路:先获取到底改哪条数据 查询该数据 渲染到前端页面供用户查看及修改
      post请求中获取被修改对象的id两种方式:
         1.input隐藏标签
         2.action携带参数
         <form action="/edit_user/?id={{ edit_obj.pk }}" method="post">
                <input type="hidden" value="{{ edit_obj.pk }}" name="id">
                <p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.name }}"></p>
                <p>password:<input type="password" name="password" class="form-control" value="{{ edit_obj.password }}"></p>
                <p>addr:<input type="text" name="addr" class="form-control" value="{{ edit_obj.addr }}"></p>
                <input type="submit" class="btn btn-success">
            </form>
      两种修改数据的方式:
      # 修改数据方式1
        models.User.objects.filter(id=id2).update(name=username,password=password,addr=addr)
        # 修改数据方式2
        edit_obj = models.User.objects.filter(id=id2).first()
        edit_obj.name = username
        edit_obj.password = password
        edit_obj.addr = addr
        edit_obj.save()
   只要是queryset对象就可以连续调用queryset对象对应的方法
   models.User.objects.filter().filter().filter().filter().filter()
   
   查询数据的两种方式
   models.User.objects.filter() 拿到的是queryset对象
   edit_obj = models.User.objects.get(id=edit_id) 拿到的就是数据对象本身(不推荐使用)
   
   
   
   
   django请求生命周期
   
   
   
   
   图书管理系统表设计
   
   书籍  >>>  出版社  一对多()
   作者  >>>  书籍    多对多
   出版社
   
   一对多    
    publish = models.ForeignKey(to='Publish')  # 关联publish表 关联字段默认就是主键id
    
   
   
   
   图书管理系统表相关
   class Book(models.Model):
      # id不写 默认自动就有  指定的话就用你指定的
      name = models.CharField(max_length=32)
      # 小数最多8位 小数部分占两位 999999.99
      price = models.DecimalField(max_digits=8,decimal_places=2)
      # 书籍与出版社是一对多关系 外键字段建在多的一方  orm会自动给这个字段加_id  >>>publish_id
      publish = models.ForeignKey(to='Publish')  # 关联publish表 关联字段默认就是主键id
      # 多对多外键字段 建议放在使用频率比较高的那张表里 为后期orm查询提供便利
      authors = models.ManyToManyField(to='Author')  # 自动帮你创建书籍与作者的关系表  不会在当前表里面创建字段


   class Publish(models.Model):
      name = models.CharField(max_length=32)
      email = models.EmailField()
      addr = models.CharField(max_length=32)

   class Author(models.Model):
      name = models.CharField(max_length=32)
      addr = models.CharField(max_length=32)
   
   
         
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值