我们将html文件默认都放在templates文件夹下
将网站所使用的静态文件默认都放在static下
静态文件
写好之后不会自动动态改变的文件资源,比如我们写好的css文件,js文件。图片文件,第三方框架文件,我们默认将所有的静态文件都放在一个static文件夹内,
django是不会自动创建static文件夹内的,需要我们自己再django目录下手动创建该文件夹,一般情况下我们再static文件夹内还会做进一步的划分处理,拿来就可以直接使用:
static ├─ bootstrap 前端已经写好了的能够直接调用的文件 ├─ js 写好的js文件 ├─ css 写好的css文件 ├─ img 用到的img文件 └─ 其他第三方文件资源
之所以再浏览器中输入url能够看见对应的资源,是因为开发者早已经提前在后端剋设了该资源的访问接口
如果不访问不到资源,说明后端没有开设该资源的接口
http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
# 如果想要访问静态文件就必须以static开头 STATIC_URL = '/static/' # 接口前缀 类似于访问静态文件的令牌 """ 例如有此路径: <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script> /static/ 前面这个就是接口前缀 bootstrap-3.3.7-dist/js/bootstrap.min.js 后面的就是路径 书写了接口前缀之后 就拥有了访问下列列表中所有文件夹内部资源的权限 然后会以从上往下的顺序在列表里面依次查找,直到拿到路径返回给页面 都没有才会报错 """ # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') # 这个static就是真正的静态文件夹路径 os.path.join(BASE_DIR, 'static1') os.path.join(BASE_DIR, 'static2') ]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>动态解析</title> {% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> </head> <body> </body> </html>
form表单默认使用的是get请求数据
form表单action参数:控制后端提交的路径
form表单method参数:默认是get请求,可以改成post请求
在前期使用django提交post请求的时候需要先去配置文件中注释掉一行代码
request.method # 返回字符串<cass'str'> 获取当前请求的请求方法,并且结果是一个纯大写的字符串类型 request.POST # 直接看成是字典即可 获取用户提交post请求过来的基本数据(不包含文件) request.POST.get() get方法只获取列表最后一个元素 request.POST.getlist() getlist方法会直接获取整个列表,不管里面有几个元素 request,GET # 直接看成是字典即可 获取用户提交的get请求数据(url问号后面的数据) request.GET.get() get方法只获取列表最后一个元素 request.GET.getlist() getlist方法会直接获取整个列表,不管里面有几个元素 request.FILES # 直接看成是字典即可 获取用户上传的文件数据 request.FILES.get() get方法只获取列表最后一个元素 request.FILES.getlist() getlist方法会直接获取整个列表,不管里面有几个元素 ''' get请求携带的数据是有大小限制的大概好像只有4KB左右 而post请求则没有限制 form表单如果需要携带文件数据 那么要添加参数 <form action="" method="post" enctype="multipart/form-data"> '''
# 书写格式(层级复杂不推荐) def login(request): """ get请求和post请求应该有不同的处理机制 :param request:请求相关的数据对象里面有很多简易的方法 :return: """ print(type( request.method)) # 返回请求方式并且是纯大写的字符串类型<class str> if request.method == 'GET': # 返回给浏览器一个登陆界面 return render(request,'login.html') elif request.method == 'POST': return Httpresponse("收到了宝贝") # 标准书写格式(层级精简推荐) def login(request): if request.method == 'POST': return Httpresponse("收到了宝贝") return render(request,'login.html')
"""django默认使用自带的sqlite3""" DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'db666', # 数据库名称 一定要事先创建好才能指定 'HOST':'127.0.0.1', # 数据库IP,暂用本地回环地址 'PORT':3306, # 数据库端口 'USER':'root', # 数据库用户名 'PASSWORD':'123', # 数据库密码 'CHARSET':'utf8' # 指定字符编码 } }
django默认用的是mysqldb模块链接MySQL
但是该模块的兼容性不好,需要手动改为用pymysql模块链接
import pymysql pymysql.install_as_MySQLdb()
""" ORM:对象关系映射 作用:目的就是为了能够让不懂SQL语句的人通过python面向对象的知识点也能够轻松自如的操作数据库 缺陷:封装程度太高,有时候sql语句的效率偏低,需要自己写SQL语句 """ 类 ---------------->>> 表 对象 --------------->>> 表里面的数据 对象点属性 ---------->>> 字段对应的值
class user(models.model): #id int primarykeyauto_increment id = models.AutoFiled(primary_key=Ture) #name varchar(32) name = models.charfield(max_length=32) age = models.integerfield()
1.将数据库修改操作先记录到小本本上(对应应用下的migrations文件夹) python manage.py makemigrations 2.真正的执行数据库迁移操作 python manage.py migrate # 只要动了models.py中跟数据库相关的代码就必须重新执行上述两条命令
""" 数据库里面已经有一些表,我们如何通过django orm操作? 1.照着数据库表字段自己在models.py 数据需要自己二次同步 2.django提供的反向同步 """ 1.先执行数据库迁移命令 完成链接 python manage.py makemigrations 2.查看代码 python manage.py inspectdb class Userinfo(models.Model): id = models.IntegerField(blank=True, null=True) name = models.CharField(max_length=32, blank=True, null=True) pwd = models.IntegerField(blank=True, null=True) class Meta: managed = False db_table = 'userinfo'
class User1(models.Model): # 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段 # 如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段 # 如果你想让主键字段名不叫id 叫uid、sid、pid等则需要自己手动指定 username = models.CharField(max_length=32)
# 字段的增加 1.可以在终端内直接给出默认值 2.该字段可以为空 pwd = models.IntegerField('密码',null=True) 3.直接给字段设置默认值 is_delete = models.IntegerField(default=0) # 字段的修改 直接修改代码,然后执行数据库迁移的两条命令即可 # 字段的删除 直接注释对应的字段,然后执行数据库迁移的两条命令即可 执行完毕之后字段对应的数据也都没有了 """ 在操作modles.py的时候一定要细心 千万不要手误注释掉重要的字段 执行迁移命令之前一定要检查下自己写的代码 建议:离开你的计算机之后一定要锁屏 """
# 1.查询数据 # select * from user where name=username; user_obj = models.User.objects.filter(name=username).first() # 2.添加数据 # insert into user(name,pwd) values(username,password); models.User.objects.create(name=username,pwd=password) # 3.查询所有的数据 # select * from user; models.User.objects.all() # [obj1,obj2,obj3,obj4] # 4.修改数据 models.User.objects.filter(id=edit_id).update(name=username,pwd=password) edit_obj.name = username edit_obj.pwd = password edit_obj.save() # 5.删除数据 models.User.objects.filter(id=delete_id).delete()
一对多:推荐建在多的一方
一对一:建在任何一方都可以,但是推荐建在查询频率较高的表中
多对多:1.自己建表
2.建在任何一方都可以,但是推荐建在查询频率较高的表中
class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2) # 总共8位 小数占2位 # 出版社外键 publish = models.ForeignKey(to='Publish') # 默认就是主键 """自动在外键字段后面加_id后缀""" # 作者外键 authors = models.ManyToManyField(to='Author') # 自动帮你创建书籍和作者的第三张表 """虚拟字段不会在表中实例化出来 而是告诉ORM创建第三张关系表""" class Publish(models.Model): title = models.CharField(max_length=32) email = models.EmailField() class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to='AuthorDetail') """自动在外键字段后面加_id后缀""" class AuthorDetail(models.Model): phone = models.BigIntegerField() addr = models.CharField(max_length=128)
Django请求的生命周期是指:当用户在浏览器上输入url到用户看到网页的这个时间段内,Django后台所发生的事情。
首先,用户在浏览器中输入url,发送一个GET方法的request请求。
Django中封装了socket的WSGi服务器,监听端口接受这个request 请求,
再进行解析封装,然后传送到中间件中,这个request请求再依次经过中间件,
对请求进行校验或处理,再传输到路由系统中进行路由分发,匹配相对应的视图函数(FBV),
再将request请求传输到views中的这个视图函数中,进行业务逻辑的处理,
调用modles模型层中表对象,通过orm拿到数据库(DB)的数据。
同时拿到templates中相应的模板进行渲染,然后将这个封装了模板response响应传输到中间键中,
依次进行处理,最后通过WSGi再进行封装处理,响应给浏览器展示给用户。