使用 Django 搭建一个登录页面

使用 Django 搭建一个登录页面

January 29, 2024·寅默
寅默

Django是基于Python的网站后端语言,单独列出来一个章节似乎并不是很合适,但是如果从其逻辑和之前的C或Pure Python 并不太一样的角度出发,似乎又可以理解。以我的角度看,Django是一个动态的语言,它会运行到某个地方停住,然后等待一个用户发来一个request,然后根据request做出反应。因而基于逻辑的不同,独立章节似乎便有必要了。(本来笔者是打算合并在第二章的,但是学习过后发现单列出来更为合适。)

搭建平台的准备工作

和之前的C或Pure Python不一样的是,django会自动提前生成很多的文件。(这一部分我们只演示一次,之后的范例会直接讲述对views.pytemplates/<project_name>/<name>.html的操作)首先我们在Linux/Mac平台下的命令行输入

django-admin startproject mytest

就会在该目录下生成以下内容

/mytest
├── manage.py
└── mytest2
    ├── asgi.py
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

其中文件manage.py算是执行文件,我们很多操作,例如调出Shell或者是启动Django都是通过这个文件进行。我们会用到setting.pyurls.py来进行编写,而剩下的那些,暂时不会用到,也不要去动他们。

创建一个 APP

这里的APP并不是传统意义上的手机APP,而是一个Application,一个应用。一个Django项目中可能会含有许多的应用,这些应用分别处理不同的功能。

我们首先来创建一个应用,我们应该在mytest同级目录下,即在mytest目录下的命令行输入

python manage.py startapp login_app

来创建一个app。(这里便是通过manage.py)来创建一个app。至此我们的文件结构应该是

/mytest
├── login_app
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── mytest2
    ├── asgi.py
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-311.pyc
    │   └── settings.cpython-311.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

另外我们需要创建一个在app里面创建一个网站的模板,即app目录下创建一个文件夹templates,而后在这个目录下(可选择再嵌套一层与app同名的文件夹)写app的html文件。下面的tree并不是刚生成就是这样,这是已经运行过后的。

/mytest
├── db.sqlite3
├── login_app
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       └── __init__.cpython-311.pyc
│   ├── models.py
│   ├── __pycache__
│   │   ├── admin.cpython-311.pyc
│   │   ├── apps.cpython-311.pyc
│   │   ├── __init__.cpython-311.pyc
│   │   ├── models.cpython-311.pyc
│   │   └── views.cpython-311.pyc
│   ├── templates
│   │   └── login_app
│   │       └── login.html
│   ├── tests.py
│   └── views.py
├── manage.py
└── mytest
    ├── asgi.py
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-311.pyc
    │   ├── settings.cpython-311.pyc
    │   ├── urls.cpython-311.pyc
    │   └── wsgi.cpython-311.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

其中__pycache__是执行之后的文件,我们无需重写。而我们现在需要在“主函数”(也就是主目录下的)的settings.py中为app注册。即

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'login_app.apps.LoginAppConfig',#这里是新增的行
]

其中新增的行表示文件login_app/apps.py/中的class LoginAppConfig。我们可以看一下这个文件内的内容。

from django.apps import AppConfig


class LoginAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'login_app'

这里面有app的名字。至此我们已经可以开一个新的命令行打开这个网站了——我们修改任何代码都会重新加载网站,不需要担心需要手动重启网站。启动网站在命令行输入如下。

python manage.py runserver

此后直接打开给出的网址即可。我们可以在输入的时候后面加上指定的端口,如果没有指定默认是8000。

开始编写网站

我们编写的地方主要在urls.py views.py以及你自创的html文件。其中的流程大概如此——我们先在urls.py中创建一个功能上类似于网站名的urls,并调用views.py中的函数。urls.py严格来说是定义了 “路由”,而views.py 里的各个函数是负责生成 “响应”,也就是“网页”的部分,网站的内容本身我们可以在模板中创作。例如我们的urls.py中应该是

from django.contrib import admin
from django.urls import path
from login_app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/',views.login_func)
]

第七行是我们新增的内容,表示我们新创的一个路径。第三行说明第七行中我们对login/ 的反应是调用views.py中的login_func函数来处理。

#views.py
from django.shortcuts import render,redirect,HttpResponse
# Create your views here.


def login_func(request):
    if request.method == "GET":
        return render(request,"login_app/login.html")
    
    user_name = request.POST.get("user")
    user_password = request.POST.get("pwd")
    if user_name == "root" and user_password == "111":
        return redirect("https://arcaea.lowiro.com/")
    
    return render(request,"login_app/login.html",{"error":"用户名或密码错误"})

views.py里面最重要的则是函数的输入是一个request。这个request是指一个包含用户所有请求的对象,它可以查看 request.method 的值获得请求的方法。这里对 GET 和 POST 种类的请求做了不同处理,这两种请求分别是进入网站的默认方式和提交表单的默认方式。

我们的views.py中对请求的方法进行判断,若是直接请求,也就是刚进入这个网站,那么就直接调用模板中的网站。模板如下

<h1>Welcome</h1>

<form method="post" action="/login/">
    {% csrf_token %}
    <input type="text" name="user" placeholder="用户名">
    <input type="password" name="pwd" placeholder="密码">
    <input type="submit" value="提交">
    <span style="color:red;">  {{error}}</span>
</form>

如果我们已经输入了用户名和密码,也就是提交了表单,这时候就是(POST)请求,那么我们读入用户名和密码,并利用if来进行判断。如果可以的话,那么就重定向到一个新的网页(这里夹带了一点点私货,这是笔者最喜欢的游戏的官网。),否则我们就重新返回这个网页。

这里我们利用了错误输入。django的html文件语法上是django定义的,也就是在生成真正的html文件前,会先对其编译,然后进行替换。如果我们没有指定信息,那么替换后的结果为空。利用这个特性,我们在输入错误之后对模板中的错误信息进行填充,这样我们就可以看到错误信息所在。需要注意的是我们在html模板中设置输入的时候添加了

{% csrf_token %}

这是因为django会自动判断我们的输入是否真正的来源于这个网站,其方法就是利用上述的代码生成一段用于验证的码。这是django的一项自动的安全措施。

最后更新于