Django(二)
django小白必会三板斧
# 哪三板斧?
HttpResponse
返回字符串给前端页面
render
返回HTML文件给前端
redirect
重定向页面(可以是自己写的接口,也可以是公网网站)
# 这三个方法可以帮助我进行前后端交互
# 导入模块(需要记住)
from django.shortcuts import HttpResponse,render,redirect
登录注册功能实现
# 思路
"""
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源
是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
言外之意就是我们没有开设接口 那么肯定访问不到
"""
# 1.编写前端页面
# 2.开设接口,根据用户请求返回页面
# 3.Django连接数据库
# 4.编写登录注册的逻辑代码
1.编写前端页面
1.1静态文件
# 编写完成后不会经常修改的与html相关的文件
eg:css文件,js文件,image文件,第三方框架
# 存储在哪?
Django中开设单独的文件夹存储--static文件夹
文件夹在项目根目录
static内部还可以根据文件功能不同再做文件夹划分
![]()
1.2静态文件配置
'''
当我们把bootstrap放进static文件夹后,通过link导入到HTML文件,项目启动后访问发现样式并没有被设置,检查发现报错404,因为项目启动后,前端访问所有的后端资源都要通过接口,这里还没有配置
'''
# 1.settings.py文件中的配置
这个文件主要就是配置访问接口(访问路径)
STATIC_URL = '/static/' # 请求前缀(自带的)
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# 这时html页面就用通过路径访问到静态文件了
/static/+文件在static文件夹下的路径
# 2.接口前缀的动态绑定(操作html文件)
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
2.开设访问接口
# 视图层
开设函数,返回前端页面
eg:
def login(request):
return render(request,'login.html')
# 路由层
配置接口
eg:
urlpatterns = [
url(r'^login/', views.login)
]
这时,我们在前端访问localhost:8080/login就可以访问到我们写的前端页面login.html
3.连接数据库
3.1pycharm连接mysql
database按钮点开里面可以操作
# database按钮在哪?
1.最右侧工具栏
2.左下方方块按钮里面选择
3.上述都没有去下载插件database
# 连接数据库
1.选择数据库
2.首次连接需要下载mysql的驱动,有提示,直接点download
3.测试连接,不通过换驱动连接
3.2Django连接数据库
"""
django默认自带一个sqlite3数据库 但是功能很少 仅用于本地测试
"""
# settings.py中修改配置
默认配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
'''这个配置的是sqlite3的数据库,我们就改这个文件就可以了'''
# 修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'my_django',
'USER': 'root',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': 3306
}
}
'''修改的时候参数名要全大写'''
# 指定模块
在项目同名的文件夹内的__init__.py
或者应用名的文件夹内的__init__.py
添加一行固定的代码
import pymysql
pymysql.install_as_MySQLdb()
3.3Django orm简介
ORM:对象关系映射
# 特点
能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL
好处:提升了开发效率...
坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优
# 概念(数据库表与类的对应)
表 类
一行行数据 类产生的一个个对象
数据字段 对象的一个个属性
3.4orm基本使用
# 如果需要使用ORM 需要去应用下的models.py中编写类代码
1.编写类代码
eg:
class User(models.Model):
uid =models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
'''
上述类代码,相当于一个建表代码,创建一个表,有三个字段,uid,username,password
uid:主键,自增 等价于uid int primary key auto_increment
username:字符类型,最大长度32 等价于username varchar(32)
password:字符类型,最大长度32 等价于password varchar(32)
''''
'''表的主键可以不写 orm会自动帮你写一个名为id的主键'''
2.执行数据库迁移命令
python3 manage.py makemigrations # 记录操作
python3 manage.py migrate # 将操作迁移到数据库
"""
首次执行迁移命令 django还会自动创建一些默认需要使用到的表
每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
"""
快捷迁移命令:
tools->run manage.py task
然后再弹出的命令窗口先敲makemigrations
在敲migrate
命令窗口会有提示
3.5orm数据操作
orm数据操作需要通过models.py里面的类产生的对象来操作
# 增
models.类名.objects.create(字段名=字段值)
等价于
insert into 表名(字段名) values(字段值)
# 查
models.类名.objects.filter(字段名=字段值)
'''这里括号里的是where条件'''
等价于
select * from 表名 where 字段名=字段值
# 改
models.类名.objects.filter(字段名=字段值).update(字段名=字段值)
'''前面括号相当于条件,后面相当于修改的内容'''
等价于
update 表名 set 字段名=字段值 where 字段名=字段值
# 删
models.类名.objects.filter(字段名=字段值).delete()
等价于
delete from 表名 where 字段名=字段值
'''如果第一个括号里不写条件就是清空整张表'''
4.逻辑代码
4.1request对象方法
"""
提交post请求 默认会报403
前期不需要过多考虑 直接去配置文件中注释一行即可
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
"""
'''在写登录注册的项目时,当用户get请求,我们返回给他登录注册的界面,当用户输完账号密码后发post请求,我们要进行登录注册操作,然后返回给用户状态,可以通过用户请求数据里面去获取请求类型进行判断'''
# 1.获取用户请求类型
request.method 返回的是纯大写的请求类型字符串
# 2.获取get请求携带的数据
request.GET 返回一个含有请求参数的字典
request.GET.get() 根据字典k取值
# 2.获取post请求携带的数据
request.POST 返回一个含有请求参数的字典
request.POST.get() 根据字典k取值
4.2逻辑代码编写
eg:
def login(request):
# 如果是get请求,返回登录界面过去
if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
# 如果是post请求,执行登录或注册
# 获取请求的是什么
res = request.POST.get('button')
if res == '去注册':
# 重定向到注册接口
return redirect('/register')
elif res == '登录':
# 执行登录操作
# 获取用户名密码
username = request.POST.get('username')
password = request.POST.get('password')
# 获取数据库中的用户名密码
res = models.User.objects.filter(username = username)
# 如果没有查询到数据,返回用户名不存在
if len(res) == 0:
return HttpResponse('用户名不存在')
if res[0].password != password:
return HttpResponse('密码错误')
return HttpResponse(f'用户{username}登陆成功')
![]()