学习内容总结
今日学习内容总结
Django学习之三板斧
前言
我们在启动Django项目后,如何添加更多的功能,通过之前的推导学习我们知道,想要添加功能,就去urls.py和views.py添加。
在实际查看Django项目与浏览器打交道时,Django自带重启功能。当识别到项目中代码有变化之后,隔段时间会自动重启,但是有时候较慢。这就是自带的重启功能。
而Django项目与浏览器打交道的视图函数都应该有返回值,常见的就是我们即将要学习的三个返回值:
HttpResponse
主要用于返回字符串类型的数据
render
主要用于返回html文件 并且支持模板语法(django自己写的)
redirect
主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
登录功能
思考
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源,是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问。言外之意就是我们没有开设接口,那么肯定访问不到。
1.那么想实现登录功能,首先要开设接口返回登录界面。
2.登录界面需要使用bootstrap并且还需要自己编写css和js。而这些文件需要写在昨天所天所说的静态文件中。
3.页面需要获取前端用户数据并且传递给后端
form表单
action参数:控制数据的提交地址
method参数:控制请求的提交方式
4.访问登录页面
这时候会发现一个问题,静态文件全部显示资源不存在。
http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
发现无法访问,因为我们并没有开设静态资源访问的接口。
5.开设静态资源的访问接口
理论上应该自己去路由层开设接口资源,但是由于静态文件资源使用频率很高。
只要是一个web项目都肯定需要,所以django为了避免开发者繁琐,提供了静态资源的配置文件,只需要填写固定的配置即可开设资源接口。
settings.py
# 静态文件资源访问接口固定配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# html页面路径
/static/mycss.css
配置文件中的问题:
1. STATIC_URL = '/static/' 作用是什么
2. STATICFILES_DIRS = [] 为什么是列表
以下列地址为例:
/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
/static/是接口前缀 表示具备访问静态文件资源的权限
具备了权限之后会拿着接口前缀后面的文件路径去列表中每个文件夹中查找
bootstrap-3.3.7-dist/css/bootstrap.min.css
找到一个就结束,比如static和static1里面都有a.txt 那么只会拿到static中的
7.接口前缀动态绑定
如果templates中有很多html文件并且都需要引入静态资源,现在把接口前缀修改了,会造成的结果就是页面无法加载资源。
静态文件
昨天粗略了解过,静态文件就是编写完成后不会经常被修改的与html页面相关的文件。而css文件、js文件、图片文件、第三方框架文件(bootstrap)等的这类型文件,都可以称之为是'静态文件'。
在django中静态文件单独开设一个文件夹存储,默认叫static文件夹。在该文件夹内还可以根据功能的不同继续划分不同的文件:css文件夹 js文件 img文件夹 others文件夹。
request对象方法
首先来一个简单的实例:
# urls.py
from django.conf.urls import url
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^login/', views.index),
]
# views.py
from django.shortcuts import render
from django.views.generic import View
# Create your views here.
class login(View)
def get(self,request):
return render(request,'login.html')
def post(self,request):
user_input = []
user = request.POST.get('user',None)
email = request.POST.get('email',None)
temp = {'user':user,'email':email}
USER_INPUT.append(temp)
return render(request,'login.html',{'data':USER_INPUT})
# login.html
# body
<form action="login/" method="post">
<input type="text" name="user"/>
<input type="text" name="email">
<input type="submit" value="提交">
</form>
{#将提交到login函数的表单内容在这里展示#}
<h1>数据展示</h1>
<table border="1">
{% for item in data %}
<tr>
<td>{{ item.user }}</td>
<td>{{ item.email }}</td>
</tr>
{% endfor %}
</table>
如果提交post请求,默认会报403。
不需要过多考虑 直接去配置文件中注释一行即可
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
实际操作中,
把浏览器信息,客户端地址,访问地址等封装到request里,以GET方式发送给login的url(因为是访问页面,所以是GET请求)。匹配到对应的url,再根据url匹配到处理函数,直接显示页面,完成访问登录页面。
在登录页面输入用户名密码,点击登录,form表单把输入的信息,浏览器信息,客户端地址,访问地址等封装到request对象里,以post的形式发送给login的url,匹配到对应的url,根据url匹配到处理函数,发现是post请求,让post处理,POST处理完,把登录用户等信息封装到request里,和上下文一起传给login.html,用来渲染login.html。
request对象的属性
1. request.scheme 代表请求的方案,http或者https
2. request.path 请求的路径,比如请求127.0.0.1/org/list,那这个值就是/org/list
3. request.method 表示请求使用的http方法,GET或者POST请求
4. request.encoding 表示提交数据的编码方式
5. request.GET 获取get请求
6. request.POST
获取post的请求,比如前端提交的用户密码,可以通过request.POST.get()来获取
另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中
7. request.COOKIES 包含所有的cookie
其中,获取post请求提交的普通数据 request.POST 。结果是一个QueryDict,可以看成字典处理。
request.POST.get('username')
request.POST.getlist('hobby')
1. get方法会拿到值列表中最后一个元素 而不是整个列表
2. getlist方法会直接拿到整个值列表
获取url后面携带的数据 request.GET 。结果是一个QueryDict,可以看成字典处理。特征与request.POST一致,使用场景也很多。
pycharm连接MySQL
其实pycharm也可以充当很多数据库软件的客户端,连接方式:
1.pycharm右上方侧边 database
2.pycharm左下方边角 database
3.上述两个地方都没有 需要下载插件 或者直接重装一个正常的pycharm
settings
plugins
搜索database下载apple即可
连接数据库
1.选择数据库
2.首次链接需要下载驱动
download driver...
3.测试链接如果不通过 则需要换驱动重新下载使用
Driver:MySQL MySQL for 5.1
django链接MySQL
默认情况下,Django连接的是自己带的sqlite数据库。但是功能很少,仅用于本地测试。
默认配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
连接mysql
1. Mysql提前创建好数据库。
2. 修改Django的settings.py文件。
3. 修改项目文件夹下的__init.py文件。
修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 默认
'NAME': 'school', # 连接的数据库
'HOST': '127.0.0.1', # mysql的ip地址
'PORT': 3306, # mysql的端口
'USER': 'root', # mysql的用户名
'PASSWORD': 'rootroot' # mysql的密码
}
}
指定模块
由于配置了Mysql,所以要替换默认的数据库引擎,在项目文件夹下的__init__.py,添加以下内容。
import pymysql
pymysql.install_as_MySQLdb()
Django orm
orm简介
ORM:对象关系映射
特点
能够让不会写SQL的python程序员使用python语法就可以直接操作MySQ
好处是提升了开发效率,坏处是封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优
对应关系:
表 类
一行行数据 类产生的一个个对象
数据字段 对象的一个个属性
基本使用
如果需要使用ORM,需要去应用下的models.py中编写代码。
1. 编写类代码
class Users(models.Model):
uid = models.AutoField(primary_key=True) # 等价于uid int primary key auto_increment
name = models.CharField(max_length=32) # 等价于name varchar(32)
pwd = models.IntegerField() # 等价于pwd int
执行数据库迁移命令:
python3 manage.py makemigrations # 记录操作
python3 manage.py migrate # 将操作迁移到数据库
首次执行迁移命令,django还会自动创建一些默认需要使用到的表。不用管他,只要咱们要的。
表名的特征
由于django支持多个应用,为了区分不同应用下可能会出现相同的表名,所以自动加上了应用的前缀,因为同一个应用下不可能出现相同的表名。
扩展:
1.表的主键可以不写 orm会自动帮你写一个名为id的主键
2.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
针对两个迁移命令 可以采用pycharm提示功能编写
tools
run manage.py task
数据操作
# 1.增
user_obj = models.Users.objects.create(name='jack', pwd='333')
print(user_obj)
print(user_obj.uid)
print(user_obj.name)
print(user_obj.pwd)
# 2.查
res = models.Users.objects.filter(name='jason')
print(res) # <QuerySet [<Users: Users object>]>
print(res[0]) # Users object
print(res[0].uid) # 1
print(res[0].name) # jason
print(res[0].pwd) # 123
# 3.改
models.Users.objects.filter(uid=1).update(name='jasonNB')
# 4.删
models.Users.objects.filter(uid=3).delete()