配置文件的介绍
1.BASE_DIR ----------- Django项目根目录
2.SECRET_KEY ---------- 加盐处理的字符串
3.DEBUG = True ---------- 调式模式,等项目上线的时候,改为False
4.ALLOWED_HOSTS ---------- DEBUG = False的时候要添加
5.INSTALLED_APPS ---------- 注册应用,创建应用后,要将应用名写进去
6.MIDDLEWARE ---------- 中间键
7.ROOT_URLCONF = '项目名.urls'
8.TEMPLATES =[{..,'DIRS': [os.path.join(BASE_DIR, 'templates')],...}]
9.WSGI_APPLICATION ='项目名.wsgi.application'
10.DATABASES ----------配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
11.AUTH_PASSWORD_VALIDATORS ---------- 认证相关
12.LANGUAGE_CODE ='en-us' ---------- 改语言的
LANGUAGE_CODE = 'zh-hans'
13.TIME_ZONE = 'UTC' ---------- 改时区的
TIME_ZONE = 'Asia/Shanghai'
14.USE_I18N = True
15.USE_L10N = True
16.USE_TZ = True
17.STATIC_URL= '/static/' ---------- 动态解析路径
静态文件配置
CDN链接
<script src = 'https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js'></script>
<script src = 'https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js'></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
我们在Django中一般把html文件放到tempates文件夹下面,把静态文件放到static文件夹下面
1.static文件:
1.CSS文件
2.JS文件
3.img
4.我们的第三方前端框架:bootstrap相关的
2.Django不会帮我们创建static文件夹,需要我们自己手动创建出来
名字可以不叫static,但是大家都叫static,约定俗成
3.我们在访问django框架资源的使用之所以可以拿到数据是因为提前在urls.py中开设了相应的资源接口,如果访问不到资源那么就是没有开设相应的接口
<script src = '../static/js/jquery.min.js'></script>
<script src = '../static/bootstrap-3.4.1-dist/js/bootstrap.min.js'></script>
<link rel="stylesheet" href="static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
上面运行报错:当把jQuery文件、bootstrap文件导入到html中,Django项目运行,会报错:Page not found (404)
1.在浏览器中输入网址,如果找不到,说明对应的服务端没有开设对外访问的接口-----如果我们在后端开放这样一个接口,那是不是就可以访问了
2.方法:
第一步:在settings.py里添加,以后凡是找静态文件,都从下面的列表中得路径去找,列表里可以有多个值
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]
第二步:在html中取消.. eg:'/static/js/jquery.min.js
# settings.py文件:
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]
# html文件
<script src = '/static/js/jquery.min.js'></script>
<script src = '/static/bootstrap-3.4.1-dist/js/bootstrap.min.js'></script>
<link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
static解释
1.在settings.py中:
1.STATIC_URL = '/static/':(接口前缀)相当于令牌,如果你想要下Django中访问静态资源,必须以static开头
2.STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]中的static和Django项目中的static文件时一样的,就是拼接的路径
2.解释
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
说明:STATIC_URL = '/static/就是接口的前缀必须是/static/,eg:'/static/bootstrap-3.4.1-dist/js/bootstrap.min.js'>;STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
];代表当满足前缀是/static/后,'/static/...'后面的路径文件要在STATICFILES_DIR的路径文件里找(从上往下,找到了,就不找了)eg:'bootstrap-3.4.1-dist/js/bootstrap.min.js'会在static、static1、static2往下找。
动态解析
1.假设:我们想要改STATIC_URL的路径,但有很多静态文件都被项目使用到了,怎么办?
2.解决:用动态解析
1.STATIC_URL = '/改的前缀名/'
2.{% load 原来被改的前缀名 %}
静态文件地址:"{% 原来被改的前缀名 '后面的地址'%}"
eg:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src = '{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}'></script>
<srcipt src = '{% static 'js/jquery.min.js' %}'></srcipt>
request对象的方法
知识回顾
验证form表单把数据提交到后端
1.验证form表单把数据提交到后端,使用到flask框架,需要安装flask模块
2.网址:http协议://域名/路径/?参数
3.form表单action属性:朝后端提交地址
不写:什么都不写,默认提交到当前地址
全写:http://127.0.0.1:5000/index/ 朝这个完整地址提交数据
只写后缀:/index/ 它会自定拼接路径:ip:port/index/------->在django框架中会遇到
4.form表单默认提交的请求方式是get,如何更改呢?
<form action="" method='post'>
5.每一个标签都应该有一个name属性,name属性的值相当于是字典的key,用户输入的值相当于是字典的v
<input type="password" placeholder="请输入密码" name="password">
6.针对于用户选择的标签,都应该有一个value值
<input type="checkbox" name="hobby" value="1"> 篮球
7.对于用户提交的文件上传,必须满足:
1.请求方式必须是post
2.enctype属性:类似以是提交数据的编码格式
1. urlencode:默认的提交格式,它只能提交普通文本数据,不能提交文件等数据
2. form-data:支持了提交文件数据,并且也可以提交普通文件数据
3. json:{"k":"v"}
3.form表单只能提交urlencode、form-data两种,不能提交json格式的数据
4.改为enctype="multipart/form-data"
8.如何朝后段提交json格式的数据,需要借助于第三方工具,接口数据--postman
推论
1.
def login(request):
print(request) # <WSGIRequest: GET '/login/'>
print('hello') # hello
return render(request,'login.html')
解释:运行上面的Django项目,做了两件事请:
1. 加载登录页面
2. 把表单中得数据提交过来
问题:上面一共做了两件事(输入/login:渲染了登陆页面(返回html数据);submite提交数据(form表单action属性不写都时候,又提交到当前地址))
2.两件事分开做:
# views文件
def login(request):
return render(request,'login.html')
def do_login(request):
print('do_login')
return HttpResponse('do_login')
# login.html文件
<form action="/do_login" >...</form>
说明:输入/login:渲染了登陆页面(返回html数据)--login();
用户输入完数据,提交'127.0.0.1:8000/do_logi'
ps:上述方法不好,一个登陆功能使用两个函数
思路一: 根据不同的请求方式,来做不同的事情
1.获取请求方式:request.method(结果是纯大写的字符串)
2.forbidden 403 以后在提交post请求方式的标签单时候,去配置文件中找到MIDDLEWARE
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',
],把'django.middleware.csrf.CsrfViewMiddleware'注释掉。
1.if判断请求的方式
def login(request):
if request.method == 'GET': # 表示浏览器端请求数据,我们就返回html文件
print(request.method, type(request.method)) # GET <class 'str'> POST <class 'str'>
return render(request,'login.html')
elif request.method == 'POST': # 表示浏览器端提交form表单的数据
# 处理post请求相关的数据
print('post')
return HttpResponse("post")
思路二:如何获取提交的数据
1.获提交的数据:request.POST;request.GET(获取POST请求发送来的普通数据(不包含文件))
2.获取提交的字典数据:request.POST.get() 、request.POST.getlist()
3.get方法默认取的是列表中得最后一个元素值
1.对于复选提交的数据:get方法获取只中最后一个
2.request.POST.getlist() h获取整个列表
4.eg:
def login(request):
if request.method == 'GET': # 表示浏览器端请求数据,我们就返回html文件
print(request.method, type(request.method))
return render(request,'login.html')
elif request.method == 'POST':
print(request.POST) # <<QueryDict: {'username': ['nana'], 'password': ['1123'], 'hobby': ['1', '2']}>
print(request.POST.get('username')) # nana
print(request.POST.get('password')) # 1123
print(request.POST.get('hobby')) # 2
print(request.POST.getlist('hobby')) # ['1', '2']
return HttpResponse("post")
3.GET请求方式的数据获取:request.GET
if request.method == 'GET':
print(request.GET) # <QueryDict: {'username': ['nana'], 'password': ['1233'], 'hobby': ['1', '2', '3']}>
print(request.GET.get('username')) # nana
print(request.GET.getlist('hobby')) # ['1', '2', '3']
return render(request, 'login.html')
方法
1.request.method 获取请求方式 结果是纯大写的字符串
2.request.POST 获取POST请求发送来的普通数据(不包含文件)
3.request.POST.get() 默认只获取列表中最后一个数据值
4.request.POST.getlist() 获取键对应的整个列表 无论有几个数据值
5.request.GET 获取url后面携带的非敏感数据
6.request.GET.get() 默认只获取列表中最后一个数据值
7.request.GET.getlist() 获取键对应的整个列表 无论有几个数据值
pycharm链接数据库
1.方式一:
在pycharm窗口右边,有Database点进去---+好-----DataSource----MySql---填写信息(选择存在的库)
2.在pycharm窗口左下角,有Database点进去
3.首次链接数据库需要下载对应的驱动
Django链接数据库(MySQL)
1.django默认自带的有一个小型数据库:sqllite,在配置文件DATABASES里
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
2.我们需要链接用Django链接MySQL数据库,更改DATABASES配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',# 指定数据库软件名称
'NAME': 'db6', # 指定库名
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'ln1998151125',
'CHARSET':'utf8',
}
}
ps:1.以上配置改完之后,框架启动不起来了
2. djang框架底层链接MySQL用的模块是MySQLdb模块,这个模块的兼容性很差,所以,我们不用,我们认为的把MySQLdb模块改为pymysql模块
3.如何修改pymysql模块呢?
在Django框架的任意__init__.py文件中加入一下两句话:
import pymysql
pymysql.install_as_MySQLdb()
4.如果你使用pymysql模块的话,每次都要加上面两句话,也很不方便,但是,你目前先用着
后面还有个模块:mysqlclient模块,这个模块的兼容性非常强,就不用在加任何东西
它有个缺点:一般情况下,安装不上.
ORM操作
1.ORM: 对象关系映射
2.作用:我们以后再操作数据库的时候,就不用在写原生sql语句,用面向对象的代码去写,然后他给你翻译成原生sql语句。
3.缺点:封装程度太高,ORM的sql执行效率没有原生sql执行的效率高,这个效率的影响暂时忽略
4.关系映射:
表---------------------类名
记录-------------------对象
字段-------------------属性
创建表、字段
1.每一个类都必须继承models.Model
2.创建
from django.db import models
# Create your models here.
class UserInfo(models.Model):
id = models.AutoField(primary_key=True) # id int primary key auto_increment
username = models.CharField(max_length=32) # username varchar(32)
password = models.CharField(max_length=64) # password varchar(32)
age = models.IntegerField() # age int
3.代码写完之后,需要执行两个命令才能把表创建出来
1.python36 manage.py makemigrations
2.python36 manage.py migrate
ps:1.python36 manage.py makemigrations:相当于把迁移过程发生的事情给你记下来了
2.python36 manage.py migrate:真正的把表创建出来
****** 上面两句话缺一不可,都要执行!!!只要修改了跟数据库相关的代码,都要执行上面两句话
1.由于每张表都应该有一个主键字段,并且主键字段名都叫id,如果满足这两个条件,那么,可以省略不写,自动帮你常见主键字段出来
2.自动添加
class Author(models.Model):
username = models.CharField(max_length=32) # username varchar(32)
password = models.CharField(max_length=64) # password varchar(32)
age = models.IntegerField() # age int
3.增加字段、修改字段、删除字段,只要修改了跟数据库相关的代码,都要执行:
1.python36 manage.py makemigrations
2.python36 manage.py migrate
查
用户名,密码登陆比对
1.获取提交过来的用户名密码
username = request.POST.get('username')
password =request.POST.get('password')
2.拿着提交过来的数据跟数据库里面的用户名和密码比对
1.导入数据库文件
from app01 import models
2.用户名密码比对
res=models.UserInfo.objects.filter(username=username,password=password)
print(res) # <QuerySet [<UserInfo: nana>]>
ps:
1.filter(username=username, password=password)里面的条件是and关系
2.models.UserInfo.objects.filter(username=username,password=password)
3.res=models.UserInfo.objects.filter() 返回的东西可以看出是一个列表,可以通过索引;
但是,多次索引取值太麻烦了,
from django.shortcuts import render,HttpResponse
def login(request):
if request.method == 'GET': # 表示浏览器端请求数据,我们就返回html文件
return render(request, 'login.html')
elif request.method == 'POST':
from app01 import models
# 密码比对
# 1.获取提交过来的用户名密码
username = request.POST.get('username')
password =request.POST.get('password')
# 2.拿着提交过来的数据跟数据库里面的用户名和密码比对
# res1 = models.UserInfo.objects
# print(res1) # app01.UserInfo.objects
res = models.UserInfo.objects.filter(username=username,password=password) # select * from userinfo where username = '' and password = ''
print(res) # <QuerySet [<UserInfo: nana>]>
print(res[0].username) # nana
print(res[0].password) # 123
return HttpResponse("post")
from django.shortcuts import render,HttpResponse
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
from app01 import models
username = request.POST.get('username')
password =request.POST.get('password')
res = models.UserInfo.objects.filter(username=username,password=password).first()
if res:
print('登陆成功')
else:
print('用户名或密码错误')
return HttpResponse("post")
创建记录
models.UserInfo.objects.create(username='tank', password='123',age=18)
1.查
models.User.objects.filter() 结果可以看成是一个列表套数据对象
如何获取对象 可以使用first()方法 如果没有值会返回None 我们if判断即可
2.增
models.User.objects.create()
3.改
models.User.objects.filter(id=1).update(name='jasonNB')
4.删
models.User.objects.filter(id=4).delete()