美文网首页
Django3框架学习一:初识

Django3框架学习一:初识

作者: 丘山Ivan | 来源:发表于2020-04-04 20:59 被阅读0次

Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 Web 应用程序框架。使用 Django,我们在几分钟之内就可以创建高品质、易维护、数据库驱动的应用程序。

环境: MacOS python3.7 ,django 3.0

1.安装

python3 install django

2.创建Django项目并启动

  • 命令行创建

    1. cd 项目保存路径
    2. Django-admin startproject 项目名
    3. cd 项目名
    4. python3 manage.py runserver 127.0.0.1:8080 启动Django项目
  • Pycharm 创建

    1. File -- New Project -- Django
    2. Location中填写django保存的目录,create 创建
    3. New Window 打开

3.项目启动

  • 命令行启动方式
    • python3 manage.py runserver IP:端口 ----> 在指定的IP和端口启动
    • python3 manage.py runserver 端口 -----> 在指定的端口启动
    • python3 manage.py runserver ----> 默认在本机的8000端口启动
  • Pycharm 启动
    点绿色小三角,直接可以启动Django项目(前提是小三角左边是你的Django项目名)

4.项目结构

以项目名为mysite为例子

  • mysite
    • __ init __.py ---> 初始化文件
    • asgi.py
    • settings.py ---> 项目设置文件,配置模板文件,静态文件,数据库信息
    • urls.py ---> 路由系统:url->函数
    • wsgi.py ---> web服务网关接口,wsgiref本机测试使用,因效率比较低,生产环境使用uwsgi
  • templates
  • manage.py ---> 对当前Django程序所有操作可以基于 python manage.py runserver

5.第一个项目

使用Pycharm启动项目后,在mysite目录下的urls.py中,可以看到Django框架自动生成了一段代码admin代码

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

在浏览器中输入127.0.0.1:8000\adimin就会有Django项目自带的登录页面出现。说明项目已经运行成功。

6.编写自己的登录页面

urls.py中的urlpatternslist中添加自己的登录页面。在Django2.x中url关键字,3.x变为path关键字

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

引入Django框架中的HttpResponse ,然后编写login函数

from django.shortcuts import HttpResponse
def login(request):
    '''
    处理用户请求,并返回内容
    :param request 用户请求相关的所有信息(对象)
    :return
    HttpResponse 只能返回字符串
    '''
    return HttpResponse('登录成功')

保存后代码,就可以在浏览器中输入127.0.0.1:8000\login,就可以看见浏览器显示了登录成功的字符串。

我们还可以返回html标签,把login函数中的return HttpResponse('登录成功')改成return HttpResponse('<input type="text"/>')

from django.shortcuts import HttpResponse
def login(request):
    '''
    处理用户请求,并返回内容
    :param request 用户请求相关的所有信息(对象)
    :return
    HttpResponse 只能返回字符串
    '''
    return HttpResponse('<input  type="text"/>')

刷新浏览器就可以看到,出现了我们返回的html标签的输入框。

7.返回HTML页面

在templates文件夹下,创建login.html文件,在body标签中加入<h1>用户登录</h1>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <h1>用户登录</h1> 
</body>
</html>

重新编写login函数,让其返回HTML页面.因为HttpResponse函数只能返回字符串,所以需要引入render函数。

from django.shortcuts import render
def login(request):
    '''
    处理用户请求,并返回内容
    :param request 用户请求相关的所有信息(对象)
    :return
    HttpResponse 只能返回字符串
    render 返回HTML文件
    '''
    # return HttpResponse('<input  type="text"/>')
     return render(request,'login.html')    

再次打开127.0.0.1:8000\login就可以看见浏览器显示了当前login.html文件

8.添加静态文件

在更目录下创建sta文件夹,在sta文件夹下创建commons.css文件.编写h1标签的颜色

h1{
    color: red;
}

login.html中引入css文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="/sta/commons.css">
</head>
<body>
    <h1>用户登录</h1>
</body>
</html>

保存刷新浏览器,发现h1标签并没有变成红色。
这是因为Django框架没有找到commons.css文件。
这时我们需要在settings.py中编辑静态文件和模板的配置

9.编辑静态文件和模板的配置

打开settings.py文件。找到TEMPLATES.这个就是配置模板(html)文件路径的地方。
需要'DIRS': [os.path.join(BASE_DIR, 'templates')]中的templates和根目录下存放模板文件的文件名一致,否则就会不能返回对应的html文件。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],#模板
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

settings.py文件,文件中找到STATIC_URL = '/static/',这是配置静态文件路径的地方。添加STATICFILES_DIRS。并在里面添加os.path.join(BASE_DIR,'sta'),对应文件名。

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/' 
STATICFILES_DIRS = (
     os.path.join(BASE_DIR,'sta'),
)

刷新浏览器,发现h1标签还是没有变红。这是因为STATIC_URL = '/static/'是虚拟路径,STATICFILES_DIRS是真实路径。只有在项目中出现了/static/才会去STATICFILES_DIRS真实路径中寻找。
所以这时候只要把login.html中的css引用改为<link rel="stylesheet" href="/static/commons.css">即可。再刷新,h1标签已经变红了。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="/static/commons.css">
</head>
<body>
    <h1>用户登录</h1>
</body>
</html>

为了方便起见我们会直接把静态文件的文件夹名起成static,这样编写代码比较方便会有提示
修改根目录下的sta文件名为static.重新编写STATICFILES_DIRS.

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
# 使用时前缀.只要有 static 就去 下面的 真实目录STATICFILES_DIRS中找
# 为了方便都就都可以创建 static 文件夹
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),
)

10.接收HTML页面返回的参数

浏览器中输入127.0.0.1:8000/loginGET请求。我们需要拿到用户名和密码进行验证,就需要在用户点击登陆按钮的时候进行post请求。
编写login.html文件,添加输入框和确定按钮.保存,刷新浏览器。会出现2个输入框和一个登陆按钮

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="/static/commons.css">
</head>
<body>
    <h1>用户登录</h1>
    <form action="/login/" method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="登录">
    </form>
</body>
</html>

编写urls.py中的login函数.打印request.POST.打印结果就是输入框的内容组成的字典

def login(request):
    '''
    处理用户请求,并返回内容
    :param request 用户请求相关的所有信息(对象)
    :return
    HttpResponse 只能返回字符串
    '''
    # return HttpResponse('<input  type="text"/>')
    print(request.POST)
  
#打印结果
<QueryDict: {'user': ['xiaoming'], 'pwd': ['123456']}>

这样我们就可以通过key-value的形似来获取用户名和密码,来验证用户信息。从而最后返回一个连接,进行重定向。
登录失败的时候给用户一个提示信息。在login.html中添加{{msg}}语法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="/static/commons.css">
</head>
<body>
    <h1>用户登录</h1>
    <form action="/login/" method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="登录">
        {{ msg }}
    </form>
</body>
</html>

返回一个链接进行重定向就需要引入djange中的redirect函数

from django.shortcuts import redirect

def login(request):
    '''
    处理用户请求,并返回内容
    :param request 用户请求相关的所有信息(对象)
    :return
    HttpResponse 只能返回字符串
    render 返回html模板文件
    redirect 重定向,返回一个链接
    '''
    # return HttpResponse('<input  type="text"/>')

    #自动找到模板路径下的login.html 文件,读取内容并返回给用户
    #模板路径的配置
    if request.method == "GET":
        return render(request,'login.html')
    else:
        #post 提交时提交的数据(请求体)
        print(request.POST)
        u = request.POST['user']
        p = request.POST['pwd']
        if u== 'xiaoming' and p == '123456':
            #登录成功.返回一个链接
            return redirect('http://www.baidu.com')
        else:
            #登录失败
            return render(request,'login.html',{'msg':"登录失败,用户名密码失败"})
    

保存代码,重新刷新浏览器,输入框内填写对应的账号密码。点击登录就会调转百度

11.返回项目中的页面链接

登录成功后我们不返回外部链接,而需要返回项目首页.
urls.py中添加index函数,在urlpatterns中添加对应链接.
如果是项目内的链接,redirect函数会自动解析,自动加上请求链接的头尾内容。

from django.shortcuts import HttpResponse,render,redirect

def login(request):
    '''
    处理用户请求,并返回内容
    :param request 用户请求相关的所有信息(对象)
    :return
    HttpResponse 只能返回字符串
    '''
    # return HttpResponse('<input  type="text"/>')
    
    #自动找到模板路径下的login.html 文件,读取内容并返回给用户
    #模板路径的配置
    if request.method == "GET":

        return render(request,'login.html')
    else:
        #post 提交时提交的数据(请求体)
        print(request.POST)
        u = request.POST['user']
        p = request.POST['pwd']
        if u== 'xiaoming' and p == '123456':
            #登录成功
            # return redirect('http://www.baidu.com')
            return  redirect('/index/') #要返回的页面
        else:
            #登录失败
            return render(request,'login.html',{'msg':"登录失败,用户名密码失败"})

def index(resquest):
    return render(resquest,'index.html')

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

templates文件夹下添加index.html文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <h1>登录成功</h1>
</body>
</html>

保存代码,重新刷新浏览器,输入框内填写对应的账号密码。就可以出现效果了。

相关文章