Django3框架学习一:初识

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>

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 项目部署到阿里云(nginx+uwsgi)上后,静态文件加载没有问题。但是在本地,使用开发服务器,却始终加载不成功...
    兰山小亭阅读 5,619评论 0 9
  • PythonWeb框架要点、Django介绍、工程搭建、配置、静态文件与路由 1.Python Web 框架要点 ...
    Cestine阅读 1,484评论 0 6
  • 今天看了本中文的Django web 框架的书书籍,现在写一下我的学习笔记,供日后复习,如果能帮到其他初学者就更好...
    sunlin1234阅读 419评论 0 0
  • 处理静态文件,尤其是在开发时,是一件很头疼的事情。在这篇文章中,我们将会讨论一些设置,目录结构和他们之间的相互影响...
    51reboot阅读 1,675评论 0 1
  • 前言 应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏...
    hehuijun阅读 14,639评论 0 17