Django学习笔记
1. GET请求 URL传值
1. 格式
127.0.0.1:8000/delete_publisher/?name=alex&id=7
2. Django后端取值
request.GET --> 大字典
request.GET["name"]/request.GET["id"] --> key不存在就报错了
request.GET.get("name", "sb") --> 推荐用这个方法取值
2. 复习一下POST方法提交的数据怎么取:
request.POST.get("key")
3. ORM操作
1. 删除
1. 先找到对象,调用对象的.delete()方法
publisher_obj = models.Publisher.objects.get(id=7)
publisher_obj.delete()
或者
models.Publisher.objects.get(id=7).delete()
2. 修改
1. 找到对象,通过修改对象的属性来修改数据库中指定字段的值,要保存
publisher_obj = models.Publisher.objects.get(id=7)
publisher_obj.name = "新的出版社名字"
publisher_obj.save() --> 把修改提交到数据库
3. request相关的知识点
1. request.method
1. GET
2. POST
2. request.POST --> 所有和post请求相关的数据
3. request.GET --> 所有和GET请求相关的数据
1. GET请求和POST请求
都属于HTTP协议规定的请求方法
2. 什么时候用GET请求?
1. 浏览器想要得到一个HTML页面的时候
2. 搜索引擎查询关键字的时候 www.sogo.com/web/?query=迪丽热巴
3. 什么时候用POST?
1. 向后端提交数据
1. 大段的数据
2. 包含隐私的数据
3. 上传文件
4. 实际中GET和POST的应用场景
1. GET:
1. 直接在浏览器地址栏输入URL访问网站
2. a标签
2. POST:
1. 登录注册
2. 修改(新增)大段的数据
3. 上传文件
form表单往后端提交数据需要注意哪三点:
1. form不是from,所有获取用户输入的标签都应该放在form里面, 并且必须要有name属性
2. action属性控制往哪儿提交,method一般都设置成post
3. 提交按钮必须是type=submit,不能是别的类型
一个完整得请求流程:
0. 启动服务端,等待客户端(用户的浏览器)来连接
1. 在浏览器地址栏输入URL,与服务端建立连接,浏览器发送请求
2. 服务端收到请求消息,解析请求消息,根据路径和函数的对应关系,找到将要执行的函数
3. 执行函数,打开HTML文件,进行字符串替换,得到一个最终要返回的HTML内容
4. 按照HTTP协议的消息格式要求,把HTML内容回复给用户浏览器(发送响应)
5. 浏览器收到响应的消息之后,按照HTML的规则渲染页面.
6. 关闭连接
例子
用户的浏览器(socket客户端)
3.客户端往服务端发消息
6.客户端接收消息
7.关闭
服务器(socket服务端)
1.启动,监听
2.等待客户端连接
4.服务端收消息
5.服务端回消息
7.关闭
浏览器和服务端通信都要遵循一个HTTP协议(消息的格式要求).
关于HTTP协议消息的格式:
1. 浏览器往服务端发的叫 请求(request)
请求的消息格式:
请求方法 路径 HTTP/1.1\r\n
k1:v1\r\n
k2:v2\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的内容
HTTP请求格式
请求方法 空格 URL 空格 协议版本 回车符换行符(\r\n) --->请求行
头部字段名:值(\r\n) 回车符换行符(\r\n) --->请求头部
...
头部字段名:值(\r\n) 回车符换行符(\r\n)
回车符换行符(\r\n)
--->请求数据
HTTP响应格式
协议版本 空格 状态码 空格 状态码描述符 回车符换行符(\r\n) --->请求行
头部字段名:值(\r\n) 回车符换行符(\r\n) --->请求头部
...
头部字段名:值(\r\n) 回车符换行符(\r\n)
回车符换行符(\r\n)
--->响应正文
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。
HTTP协议采用了请求/响应模型。
客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。
服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
GET HEAD POST PUT DELETE TRACE OPTIONS CONNECT
HTTP状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误
URL
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中
传送协议。
层级URL标记符号(为[//],固定不变)
访问资源需要的凭证信息(可省略)
服务器。(通常为域名,有时为IP地址)
端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
路径。(以“/”字符区别路径中的每一个目录名称)
查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
片段。以“#”字符为起点
Django理解
1. web框架的本质:
socket服务端 与 浏览器的通信
2. socket服务端功能划分:(python web框架的本质)
a. 负责与浏览器收发消息(socket通信) --> 按照HTTP协议消息格式去解析消息wsgiref/uWsgi/gunicorn...
b. 根据用户访问不同的路径执行不同的函数 --> 主要的业务逻辑
c. 从HTML读取出内容,并且完成字符串的替换 --> jinja2(模板语言)==模板(特殊符号 --> 数据)
动态的网页:
本质上都是字符串的替换
字符串替换发生在什么地方:
在服务端替换完再返回给浏览器!!!
1. 按上面三个功能划分:
1. 框架自带a,b,c --> Tornado
2. 框架自带b和c,使用第三方的a --> Django
3. 框架自带b,使用第三方的a和c --> Flask
2. 按另一个维度来划分:
1. Django --> 大而全(你做一个网站能用到的它都有)
2. 其他 --> Flask 轻量级
3. 新建Django项目
命令行创建:
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ django==1.11.11
django-admin startproject mysite
pycharm创建:
1. File --> New project --> 左侧选Django --> 右侧填项目路径,并且勾选python.exe
3.Django项目的启动:
1. 命令行启动
在项目的根目录下(也就是有manage.py的那个目录),运行:
python3 manage.py runserver IP:端口--> 在指定的IP和端口启动
python3 manage.py runserver 端口 --> 在指定的端口启动
python3 manage.py runserver --> 默认在本机的8000端口启动
2. PyCharm启动
点绿色的小三角,直接可以启动Django项目(前提是小三角左边是你的Django项目名)
4. 设置Django项目:
1.manage.py-------(管理)
所有管理Django项目入口文件 都是从这里开始
1.settings.py---------(配置信息)
1. 配置HTML文件存放的位置
1. Templates模板(存放HTML文件的配置) <-- 告诉Django去哪儿找我的HTML文件
2. 配置静态文件存放的位置
1. 静态文件(css/js/图片)
# 静态文件保存目录的别名
STATIC_URL = '/static/'
# 所有静态文件(css/js/图片)都放在我下面你配置的文件夹中
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
2. 注释掉setting.py中 带有 csrf 的那一行(大概45~47行)
3.复习 import os
os.path.abspath(返回绝对路径)
os.path.dirname(返回当前目录的上一级目录)
os.path.join(--,'ykgege') -->拼接
2.urls.py
路径和函数相关链的
3.wsgi.py
跟socket通信有关
4. Django WEB请求流程(简版)
1. 启动Django项目,等待用户连接
2. 浏览器在地址栏输入URL,来连接我的Django项目
3. 在urls.py中 找 路径和函数的 对应关系
4. 执行对应的函数
5. 返回响应
5.views.py
专门用来定义处理请求的函数
from django.shortcuts import HttpResponse, render, redirect
HttpResponse() 传一个字符串 ("要返回的内容") --> 通常用于直接返回数据
render(request, "html文件", {"k1": v1}) 传一个html文件返回一个HTML文件或者打开文件进行字符串替换
redirect("URL")跳转 重定向
GET请求和POST请求
GET请求:
1. 浏览器请求一个页面
2. 搜索引擎检索关键字的时候
POST请求:
1. 浏览器向服务端提交数据,比如登录/注册等
Django中的APP:
project -->项目
APP --> 应用
方便我们在一个大的Django项目中,管理实现不同的业务功能.
1. 创建APP的命令
1.命令行,在Django项目的根目录输入:
python3 manage.py startapp app名字
目录结构
migrations(迁移)
__init__.py(加载模块用)
admin.py
apps.py(app相关的配置项)
models.py#ORM相关的只能写在这个文件里,写到别的文件里Django找不到
tests.py
view.py(放函数的文件)
告诉Django新创建的app
settings.py里面的INSTALLED_APPS(告诉django有哪些app)直接写名字 或者 app01.apps.App01Config
ORM:
连接数据库
import pymysql
pymyaql.connect(... ...) (连接数据库)
python语法 --自动翻译--> SQL语句
类似于jQuery DOM
$("#d1") --自动翻译--> document.getElementById("d1")
优点:
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="张三")
知识点总结:
MVC M -- >模型 和数据交互 v --> 视图 把数据塞到网页 c -->控制器 处理方式
MTV
1.Django模板语言 (字符串的替换)
Template(模板)
{{}} -->跟变量相关
{%%} -->跟逻辑相关
tags(逻辑相关)
1.{{name}} -->变量名
2.for 循环
{% for i in list%}
{{forloop.counter}}
{{forloop.last}} 最后一次循环
{{i}}
{%endfor%}
3.if 判断
{% if 10>5 %}
...
{%else%}
...
{%end if%}
4.if .. in 判断
{% if name in list%}
...
{% endif%}
5 导入
. {%load .. %}
6.{% with%} 定义一个中间变量
{%withfor%}
7.{# 注释#}
接收对象
name = "123" {{name}}
l = [1,2,3] {{l.0}}
dit = {"name":"yi","age":12} {{dit.0.name}}
类的实例化对象 {{o.属性 or o.方法}}
Filters(在变量上进行一些操作)
语法:{{value|filter_name:参数}}
default 默认输出
length 长度
slice 切片
data 时间格式化
safe 对HTML标签和JS等语法标签进行自动转义 (不转义)
truncatechars 截断多于字符串
自定义filters
创建一个templates包
from django import template
#生成一个注册用的实例
register = template.Library()
#定义并注册一个自定义的filter函数
@register.filter(name='addsb')
def add_sb(arg):
return "{} sb".format(argj)
母版和继承基本使用
把多个页面重复的写在母版中
{%block page-main%}
{% endblock %}
其他的页面继承
{% extends 'base.html'%} -->必须放在第一行
在base.html中可以定义很多block,通常我们会额外定义page-css和pase-js(防止资源浪费)
{%block page-main%}
...
{% endblock %}
views返回的页面是子页面不是基面
组件
{% include 'navbar.html' %}把单独的固定的功能,放在单独html,在用到地方直接include
{% load static %} 加载静态文件
某个文件多处被用到可以存为一个变量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
视图(view)
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片
CBV(基于类的视图)和ffTBV(基于函数实现的视图)
Request对象
request.method -->获取请求的方法(GET,POST)
request.GET -->通常获取URL里面的参数
127.0.0.1:80000/web/?id=1&&name=yimi
request.GET -->{"id":1,"name":"yimi"}
request.GET.get("id")
request.POST -->用来获取POST提交过来的数据
request.POST.get("name")
request.path_info -->获取用户请求的路径(不包含IP和url参数)
request.body --> 和post请求相关