48、配置文件介绍、静态文件的配置、request对象方法、pycharm链接mysql、django链接mysql、orm操作

115 阅读9分钟

配置文件的介绍

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:真正的把表创建出来
    ****** 上面两句话缺一不可,都要执行!!!只要修改了跟数据库相关的代码,都要执行上面两句话

orm1.png

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()