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)
django2
最新推荐文章于 2022-03-31 17:32:32 发布