第一章 django安装与介绍
一个完整的项目有数据持久层、业务逻辑层、表现层
其中表现层的html页面时存放在templates文件下的,而一些别的静态资源则需要在项目根目录下创建一个static文件(名字自定),在静态资源文件夹中放css、js、图片等。
业务逻辑层中对应的是views.py中的视图函数,通过编写函数来完成业务逻辑。
数据持久层则是首先在models.py中设置数据库,然后迁移表从而获取对应数据库,以便操作。
通过上诉三层需要设置django配置文件,其中静态资源文件需要开设静态端口
静态文件资源访问接口固定配置
STATIC_URL = "/static/" #是接口前缀 表示具备访问静态文件资源的权限
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
] #此处为列表,但是查找资源时一但找到资源就会自动停止在列表中的搜索
如: html页面路径
< link rel=“stylesheet” href=“/static/bootstrap-3.4.1-dist/css/bootstrap.css”>
当资源接口名需要反复变更时:可以对资源接口实行动态绑定
接口前缀动态绑定
此时配置文件中的STATIC_URL 可以随意修改只需要在引入资源文件处做一个修改即可
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.css' %}">
django配置文件中默认配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
连接到对应数据库修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "dj", #数据库名字
'HOST': "127.0.0.1", #连接数据库ip
'PORT': 3306, #连接数据库端口
"USER": "root", #连接的用户名
"PASSWORD": "root", #连接的密码
#除此以外还可以添加别的设置如charset等但一定要大写
}
}
针对于django3以前的版本需要额外设置模块
在项目同名的文件夹内的__init__.py
或者app容器的文件夹内的__init__.py
添加一行固定的代码
import pymysql
pymysql.install_as_MySQLdb()
主要用于返回字符串类型的数据
由于该方法返回的值能直接显示在页面上,所以不创建html
1.先在urls中添加路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^isHttpResponse/', views.isHttpResponse),
]
2.在views中添加视图函数
def isHttpResponse(request):
return HttpResponse("这是一个字符串")
3.开启django服务后直接访问url
主要用于返回html文件 并且支持模板语法
1.先在urls中添加路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^register/', views.register),
]
2.在views中添加视图函数
def isHttpResponse(request):
url(r'^register/', views.register),
3.在templates模板文件下创建register.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册title>
<link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.css">
head>
<body>
<div class="container center-block">
<h1>注册h1>
<form action="" method="post">
<div class="form-group">
<label for="id_username">用户名:label>
<input type="text" class="form-control" id="id_username" placeholder="用户名">
div>
<div class="form-group">
<label for="id_password">密码:label>
<input type="password" class="form-control" id="id_password" placeholder="密码">
div>
<div class="checkbox">
<p>爱好:p>
<label class="checkbox-inline">
<input type="checkbox" id="is_play" value="play"> 打游戏
label>
<label class="checkbox-inline">
<input type="checkbox" id="is_talk" value="talk"> 说话
label>
<label class="checkbox-inline">
<input type="checkbox" id="is_sleep" value="sleep"> 睡觉
label>
div>
<button type="submit" id="regbtn" class="btn btn-default">注册button>
form>
div>
body>
html>
主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
1.先在urls中添加路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^isRedirect/', views.isRedirect),
]
2.在views中添加视图函数
def isRedirect(request):
return redirect("/register/")
提交post请求 默认会报403,因为django全局发送post请求均需要字符串验证
csrf功能:防止跨站请求伪造的功能
直接去配置文件中注释一行可以去除csrf
MIDDLEWARE = [
# ‘django.middleware.csrf.CsrfViewMiddleware’,
]
get请求和post请求都会触发同一个视图函数的运行,触发为action中设置的视图函数,如果没设置就以该网页自身视图函数运行。
针对不同的请求执行不同的代码
GET返回url中?后的数据
POST获取用户数据提交的普通数据
所以此时需要对全局的request进行操作
#获取request的请求类型
request.method #返回的是纯大写的请求方法字符串
#获取post方式的form表单数据
request.POST #结果是一个QueryDict 可以看成字典处理
request.POST.get('username') #获取的到的是一个对象
request.POST.getlist('username') #获取的整个数据列表
# 获取url后面携带的数据
request.GET #结果是一个QueryDict 可以看成字典处理
request.GET.get('username') #获取的到的是一个对象
request.GET.getlist('username') #获取的整个数据列表
ORM:对象关系映射
能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL
好处:提升了开发效率,框架使用门槛降低等等
坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优
表 => 类
一行行数据 => 类产生的一个个对象
数据字段 => 对象的一个个属性
使用orm前提需要取models.py中编辑类代码
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
python manage.py makemigrations # 记录操作
python manage.py migrate # 将操作迁移到数据库
首次执行迁移命令 django还会自动创建一些默认需要使用到的表
models.py中User => mysql中app01_user
由于django支持多个应用 为了区分不同应用下可能会出现相同的表名
所以自动加上了应用的前缀 因为同一个应用下不可能出现相同的表名
1.表的主键可以不写 orm会自动帮你写一个名为id的主键
2.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
针对两个迁移命令 可以采用pycharm提示功能编写
# 增加数据
user_obj = models.User.objects.create(username='kdq', password='kdq123')
# 修改 不使用filter则为全部记录都修改
models.Users.objects.filter(uid=1).update(name='kdqdd')
# 查看 不使用filter则为全部记录都查看
res = models.Users.objects.filter(name='kdq')
#如果获取的记录不是一条需要使用索引或者first()获取第一条
res = models.Users.objects.filter().first() # 一堆记录中的第一条
res = models.Users.objects.all() # 表中的全部记录
re = res[0] # 拿第一条记录
# 删除 不使用filter则为全部记录都删除
models.Users.objects.filter(uid=3).delete()