2018-9-5 18:10:52
先贴上笔记
day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n k1:v1\r\n ...\r\n \r\n 请求体 <-- 可以有,可以没有 2. 响应(response) HTTP/1.1 状态码 状态描述符\r\n k1:v1\r\n Content-Type: text/html; charset=utf8\r\n \r\n 响应正文 <-- HTML内容 2. Python web框架的本质: a. 收发socket消息 --> 按照HTTP协议消息格式去解析消息 b. 路径和要执行的函数的对应关系 --> 主要的业务逻辑 c. 字符串替换 --> 模板(特殊符号 --> 数据) 3. 一个完整得请求流程: 0. 启动服务端,等待客户端(用户的浏览器)来连接 1. 在浏览器地址栏输入URL,与服务端建立连接,浏览器发送请求 2. 服务端收到请求消息,解析请求消息,根据路径和函数的对应关系,找到将要执行的函数 3. 执行函数,打开HTML文件,进行字符串替换,得到一个最终要返回的HTML内容 4. 按照HTTP协议的消息格式要求,把HTML内容回复给用户浏览器(发送响应) 5. 浏览器收到响应的消息之后,按照HTML的规则渲染页面. 6. 关闭连接 2. Django昨日内容梳理: 0. Django安装 pip3 install django==1.11.11 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ django==1.11.11 PyCharm安装的时候: 注意不要勾选那个选项 (你们懂得) 1. Django项目的启动: 1. 命令行启动 在项目的根目录下(也就是有manage.py的那个目录),运行: python3 manage.py runserver IP:端口--> 在指定的IP和端口启动 python3 manage.py runserver 端口 --> 在指定的端口启动 python3 manage.py runserver --> 默认在本机的8000端口启动 2. PyCharm启动 点绿色的小三角,直接可以启动Django项目(前提是小三角左边是你的Django项目名) 2. 配置相关 项目名/settings.py文件 1. Templates(存放HTML文件的配置) <-- 告诉Django去哪儿找我的HTML文件 2. 静态文件(css/js/图片) # 静态文件保存目录的别名 STATIC_URL = ‘/static/‘ # 所有静态文件(css/js/图片)都放在我下面你配置的文件夹中 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ] 3. 注释掉setting.py中 带有 csrf 的那一行(大概45~47行) 3. 今日内容 1. 登录的完整示例 复习: form表单往后端提交数据需要注意哪三点: 五一回来默写 <-- 谁写错成from谁就请大家吃雪糕 1. form不是from,所有获取用户输入的标签都应该放在form里面, 并且必须要有name属性 2. action属性控制往哪儿提交,method一般都设置成post 3. 提交按钮必须是type=submit,不能是别的类型 2. GET请求和POST请求 GET请求: 1. 浏览器请求一个页面 2. 搜索引擎检索关键字的时候 POST请求: 1. 浏览器向服务端提交数据,比如登录/注册等 3. Django中的APP: 什么是APP?以及为什么要用APP? project --> 项目 (老男孩教育大学校) APP --> 应用 (Linux学院/Python学院/大数据学院/Java学院) 方便我们在一个大的Django项目中,管理实现不同的业务功能. 1. 创建APP的命令 1. 命令行,在Django项目的根目录输入: python3 manage.py startapp app名字 4. ORM import pymysql pymysql.connect( ... ... ) 1. 不同的程序员写的SQL水平参差不齐 2. 执行效率也参差不齐 python语法 --自动翻译--> SQL语句 jQuery DOM $("#d1") --自动翻译--> document.getElementById("d1") ORM: 优点: 1. 简单,不用自己写SQL语句 2. 开发效率高 缺点: 1. 记忆你这个特殊的语法 2. 相对于大神些的SQL语句,肯定执行效率有差距 ORM的对应关系: 类 ---> 数据表 对象 ---> 数据行 属性 ---> 字段 ORM能做的事儿: 1. 操作数据表 --> 创建表/删除表/修改表 操作models.py里面的类 2. 操作数据行 --> 数据的增删改查 不能创建数据库,自己动手创建数据库 使用Django的ORM详细步骤: 1. 自己动手创建数据库 create database 数据库名; 2. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库) # 数据库相关的配置 DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, # 连接的数据库类型 ‘HOST‘: ‘127.0.0.1‘, # 连接数据库的地址 ‘PORT‘: 3306, # 端口 ‘NAME‘: "day61", # 数据库名称 ‘USER‘: ‘root‘, # 用户 ‘PASSWORD‘: ‘123456‘ # 密码 } } 3. 告诉Django用pymysql代替默认的MySQLDB 连接MySQL数据库 在项目/__init__.py文件中,写下面两句: import pymysql # 告诉Django用pymysql来代替默认的MySQLdb pymysql.install_as_MySQLdb() 4. 在app下面的models.py文件中定义一个类,这个类必须继承models.Model class 类名(models.Model): ... 5. 执行两个命令 1. python3 manage.py makemigrations 2. python3 manage.py migrate ORM单表的增加和查询: 1. 查询 models.UserInfo.objects.all() #这个是一个对象 2. 增加 models.UserInfo.objects.create(name="张三")
3.删除
models.UserInfo.objects.filter(id=nid).delete()
4 修改
models.UserInfo.objects.filter(id=nid).update(name=username)
使用Django实现数据库的增删改查
from django.shortcuts import render, redirect, HttpResponse from app01 import models # 专门用来放函数 # 2018-9-4 21:32:46 睡觉去!!啦啦啦明天继续! def login(request): # 如果你是POST请求 if request.method == "POST": # 这里必须是大写 # 如果你是POST请求,我就取出提交的数据,做登入判断 # 获取用户提交数据 email = request.POST.get("email", None) pwd = request.POST.get("pwd", None) print(email, pwd) # 做是否登入成功的判断 if email == "1076176004@qq.com" and pwd == "1": # 登入成功 # redirect 回复一个特殊的响应,这个响应会让用户的浏览器请求指定的URL return redirect("http://www.baidu.com") else: # 登入失败 error_msg = "邮箱或密码错误" # render完成html页面的字符串替换 return render(request, "login.html", {"error": error_msg}) # 不是POST请求就走下面这一句 return render(request, "login.html") # 2018-9-5 16:09:55 # 展示所有用户的函数 def user_list(request): # 去数据库中查询所有的用用户 # 利用ORM这个工具去查询数据库,不用自己去查询 ret = models.UserInfo.objects.all() print(ret[0].id, ret[0].name) # 打开user_html文件 return render(request, "user_list.html", {"user_list": ret}) # return HttpResponse("别闹了!") # 添加用用户的函数 def add_user(request): if request.method == "POST": # 用户填写了新的用户名,并发送了POST请求 new_name = request.POST.get("username", None) # 去数据库中新创建一条用户记录 models.UserInfo.objects.create(name=new_name) # 添加成功后直接跳转到用户列表页 return redirect("/user_list/") # 第一个请求页面的时候,就返回一个页面,页面上有两个框让用户填写 return render(request, "add_user.html") # 修改用户的函数 def edit_user(request): if request.method == "GET": # 找到用户的ID nid = request.GET.get("nid") # 根据id找到用户的名字 这找到的是对象 result = models.UserInfo.objects.get(id=nid) # result.name result.id return render(request, ‘edit_user.html‘, {‘result‘: result}) else: nid = request.GET.get(‘nid‘) username = request.POST.get(‘username‘) models.UserInfo.objects.filter(id=nid).update(name=username) return redirect("/user_list/") # 删除用户的函数 def del_user(request): # 在页面提交时候有nid nid = request.GET.get("nid") # 根据id删除user models.UserInfo.objects.filter(id=nid).delete() return redirect("/user_list/")
user_list.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户列表页</title> </head> <body> <a href="/add_user/">添加用户</a> <table border="1"> <thead> <tr> <th>id值</th> <th>用户名</th> </tr> </thead> <tbody> {% for user in user_list %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> {# 提交的时候,加上nid 方便修改时候找到ID #}
<td><a href="/edit_user/?nid={{ user.id }}">编辑</a></td> {# 提交的时候,加上nid 方便删除时候找到ID #} <td><a href="/del_user/?nid={{ user.id }}">删除</a></td> </tr> {% endfor %} </tbody> </table> </body> </html>
add_user.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加用户</title> </head> <body> <form action="/add_user/" method="post"> <p>用户名: <input type="text" name="username"> </p> <p> <input type="submit" value="提交"> </p> </form> </body> </html>
edit_user.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>编辑用户</title> </head> <body> <form action="/edit_user/?nid={{ result.id }}" method="post" > <p>用户名: <input type="text" name="username" value="{{ result.name}}"> </p> <p> <input type="submit" value="提交"> </p> </form> </body> </html>
原文:https://www.cnblogs.com/zhen1996/p/9593695.html