通过登录流程大致了解django框架

通过登录流程大致了解django框架

1. 开设登录资源

用户想要通过浏览器输入网址访问到相应的资源的前提是后端要提前开设该资源的访问,如果后端不开设相应的资源,用户就无法访问

开设资源首先要通过项目文件夹下面的url文件(路由与视图的对应关系)下分发任务到视图函数进行逻辑处理

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 登录功能
    url(r'^login/', views.login),
]

2. 静态文件配置

当用户发送请求进行登录时,我们就要给用户返回一个登录界面,所以,我们就要提前写好一个登录的前端界面,当用户发送请求时,我们把这个界面返回给用户

在django中,我们会把前端的HTML文件全部存放到templates文件夹中

而在写前端页面时,我们总会需要用到一些静态文件,我们需要手动创建一个static文件夹来存放这些文件夹,为了方便管理,在static文件加下也可以创建其他的文件夹

静态文件:静态文件指的是网站所使用到的提前写好的css、js 第三方的前端模块、图片等

但是我们把这些文件全都放好后,我们会发现通过浏览器并不能访问到这些静态文件,出现这种情况的原因就是:django后端如果想暴露后端资源,必须去urls里面开设相应的资源接口,但是有过多资源时,一一设置接口很不现实,所以django给我提供了配置,我们只需要到setting文件夹下进行配置就好了,配置方法如下:

STATIC_URL = '/static/'
# 这个static是访问静态资源的接口前缀,
# 你想访问我的静态资源就必须使用static开头,
# 之后我会拿着static后面的路径去下面的文件夹中找

# 手动开设静态资源访问资源,这个里面个可以写多个文件夹,第一个没找到,就去下面一个文件夹找
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static') # 将static文件夹下的所有资源暴露给用户
]

这样问题又来了,当我么有个需求,要求你改动STALTIC_URL中的接口前缀,这样我们就需要把所有用到这个接口前缀的地方都进行改动

对于这个问题,我们可以使用静态文件的动态绑定的方法

{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
		<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

3. form表单的请求方式

我们把静态文件配置好后,我们就可以通过render方法返回一个有css、js样式的前端登录页面,登录页面我们需要接收到用户发送来的数据进行校验,那么我们该怎么去拿到这个数据?

首先,我们需要先了解的一点是,form表单默认的是使用get请求,所以我们在前端页面输入完信息进行提交后可以看到此时的url变为http://127.0.0.1:8000/login/?username=koi_l&password=123这样的形式,我们可以清除的看到我们刚刚输入的信息,这样一定是不安全的,而且get请求的大小也是有限制的,所以我们通常只会用get请求携带一些不重要的数据

为了解决这个问题,我们就要到前端页面的form标签中修改默认的请求方式<form action="" method="post">,这个action不写是默认向当前地址发送请求。

在修改完成后,提交form表单数据,后可能会出现403的情况,403的意思是服务端拒绝请求,出现这个问题我们可以在settings文件中暂时把MIDDLEWARE这个列表中的 'django.middleware.csrf.CsrfViewMiddleware',注释掉,然后我们就可以正常的提交form表单了

4. request方法

在django中,无论是get请求还是post请求都会执行视图函数,在登录功能中,用户通过get请求拿到登录页面,然后通过post请求提交数据,然后后端做校验,

所以我们首先就要先判断用户是get请求还是post请求,我们可以通过传给视图函数的参数request进行判断

request是一个对象,这个对象有很多方法,现在暂时了解它的部分方法

  1. request.method:获取请求方式,并且返回的结果是大写的字符串
  2. request.POST:获取用户提交的post请求数据,我们可以暂时把返回的数据当成一个字典套列表
  3. request.GET:获取用户提交的get请求数据,返回的结果也可以看成一个字典套列表

request.POST获取的结果是一个字典,我们可以通过get方法来获取具体的值,但是与字典不同的是,get方法默认只会获取列表的最后一个元素,想要获取整个列表,可以使用request.POST.getlist()的方法,request.GET方法也一样

5. 连接数据库

在写django项目的时候 一个django就对应一个数据库,不要出现多个项目使用同一个数据的情况

这里以MySQL数据库为例,使用django连接MySQL数据库必须有两部操作

  1. 首先要通过配置文件进行配置,在settings文件里找到DATABASES字典,修该这个字典

    修改的方法与pymysql配置相似

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 指定数据库类型
            'NAME': 'day49',  # 指定库的名字
            'USER':'root',  # 注意 键必须是全大写
            'PASSWORD':'xxx',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'CHARSET':'utf8'
        }
    }
    
  2. 配置完setting之后还不行,还要告诉django不要使用默认的mysqldb连接,而是使用pymsql连接

    可以在项目名下的__init__.py中写,也可以在应用名下的__init__.py中写

    import pymysql
    	pymysql.install_as_MySQLdb()
    

6. django的orm操作方法

django操作orm:

  1. 在应用名下的models.py中书写模型类
  2. 书写完模型类之后要执行数据库迁移语句

数据库迁移命令有两条,这两条命令一定是同时出现的,而且每次对模型类进行改动后,就一定要执行数据库迁移命令

python manage.py makemigrations  # 记录数据库的修改
python manage.py migrate  # 将修改同步到数据库中
模型表字段的增删改查
		字段的修改
			直接修改代码 然后执行数据库迁移命令即可(两条一条不能少)
			    # 方式1  设置默认值
				email = models.EmailField(default='123@qq.com')  # varchar
				# 方式2   允许字段为空
				phone = models.BigIntegerField(null=True)
				# 直接在提示中给默认值
				gender = models.CharField(max_length=32)
		字段的删除
			直接注释掉对应的字段 然后再执行数据库迁移命令即可(谨慎使用)
			
	
	模型表数据的增删改查(******)
	查
		data = models.User.objects.filter(username=username)  # <QuerySet [<User: User object>]>
		"""
		filter返回的结果是一个"列表",里面才是真正数据对象
		filer括号内可以放多个关键字参数 这多个关键字参数在查询的时候 是and关系
		"""
		user_list = models.User.objects.all()  # models.User.objects.filter()
		"""
		结果是一个"列表" 里面是一个个的数据对象
		"""
	增
		user_obj = models.User.objects.create(username=username,password=password)
        print(user_obj,user_obj.username,user_obj.password)
		# create方法会有一个返回值  返回值就是当前被创建的对象本身
		
	改
		models.User.objects.filter(id=edit_id).update(username=username,password=password)
        """
        批量操作  会将filter查询出来的列表中所有的对象全部更新
        """
	
	删(一般情况下不会使用)
		models.User.objects.filter(id=delete_id).delete()
		"""
			批量操作  会将filter查询出来的列表中所有的对象全部删除
		"""
原文地址:https://www.cnblogs.com/lyyblog0715/p/11930724.html