Django web 基础

Posted 阿里山QQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django web 基础相关的知识,希望对你有一定的参考价值。

一、Django概述

Django大而全;

创建Django工程:django-admin startproject sitename

创建django之后生成的目录结构如下:

Project

    Project

        settings

        url

        wsgi

    web

        model

        views

        test

        admin

    administrator
Django工程目录结构

D:\\python_scripts\\s11day17_Django>python manage.py startapp app01  #创建app;一个app是一个完整的软件或者功能;

app下面的文件:

    models:对数据库操作的;

    views:函数放置的文件;

    test:做测,忽略;

    admin:Django的后台管理平台
app下面的文件

http://127.0.0.1:8000/admin      访问Django的后台管理平台;

可以创建admin后台管理的账户,账户默认存在于数据库下,存放位置在settings中定义如下:

DATABASES = {
\'default\': {
\'ENGINE\': \'django.db.backends.sqlite3\',
\'NAME\': os.path.join(BASE_DIR, \'db.sqlite3\'),
}
}

下面写一个http请求,urls是路由系统:
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^home/\',views.home),            #一个url对应一个函数,函数存在于app的views中
]
urls
views中的函数如下:
from django.shortcuts import render

# Create your views here.
from django.shortcuts import HttpResponse
def home(request):    #此处的request是必须的
    return HttpResponse(\'ok\')
views

D:\\python_scripts\\s11day17_Django>python manage.py runserver 127.0.0.1:8009    #启动Django程序;或者在Django工程的edit下面配置端口http://127.0.0.1:8009/home/    #访问

-----http请求完毕;


Django模板渲染
在app的views中添加的函数返回html文件内容,如下:
#!/usr/bin/env python
#coding:utf-8
from django.shortcuts import render

# Create your views here.
from django.shortcuts import HttpResponse
def home(request):
    #return HttpResponse(\'ok\')
    \'\'\'render内部找到home.html,读取html返回给用户,render和跨站请求伪造相关\'\'\'
    return render(request,\'home.html\')
home.html

可以看到默认到templates模块下找该文件了;那么程序如何知道html文件时在templates下面去找的呢?事实上,是在settings配置文件下面设置的啦;不同版本的Django配置有所不同;
TEMPLATES = [
{
\'BACKEND\': \'django.template.backends.django.DjangoTemplates\',
\'DIRS\': [os.path.join(BASE_DIR, \'templates\')]
,


就OK拉~~~~~~~

Django内部也使用jinjia2模板:
views内容如下:
#!/usr/bin/env python
#coding:utf-8
# Create your views here.
from django.shortcuts import render
from django.shortcuts import HttpResponse,render_to_response
def home(request):
    #return HttpResponse
    #return render_to_response(request,\'home.html\')
    \'\'\'render内部找到home.html,读取html返回给用户\'\'\'
    dic ={\'name\':\'Charles\',\'age\':18}
    return render(request,\'home.html\',dic)
views

 


home.html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>Home</h1>
    <h2>{{ name }}</h2>
    <h2>{{ age }}</h2>
</body>
</html>
home.html
模板渲染完毕



模板语言和自定义simple_tag
home.html模板语言:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>Home</h1>
    <h2>{{ name }}</h2>
    <h2>{{ age }}</h2>
    <ul>
    {% for item in user_list %}
        <li>{{ item }},{{ forloop.first }}</li>
    {% endfor %}
    </ul>
</body>
</html>
home.html
views内容如下:
#!/usr/bin/env python
#coding:utf-8
# Create your views here.
from django.shortcuts import render
from django.shortcuts import HttpResponse,render_to_response
def home(request):
    #return HttpResponse
    #return render_to_response(request,\'home.html\')
    \'\'\'render内部找到home.html,读取html返回给用户\'\'\'
    dic ={\'name\':\'Charles\',\'age\':18,\'user_list\':{\'Charles\',\'wahaha\',\'Rain\'}}
    return render(request,\'home.html\',dic)
view

尽管模板语言可以提供部分函数,实现一部分功能,但是有些需要我们自定义区实现:
1、在app中创建templatetags和文件

2、

3、

Django之母版:
什么叫做母版:红色部分在其他页面走不回改变,那么就没有必要再任何页面写这些内容啦~~~,可以创建母版实现啦,类似于类的继承

那么如何实现母版以及继承母版:

master下的m1为母版:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <style>
        .header{
            height: 48px;
            background-color: red;
        }
        .body{
            background-color: #dddddd;
        }
        .body .menu{
            background-color: green;
            float: left;
            width: 2%;
        }
        .body .content{
            background-color: darkgoldenrod;
            float: left;
            width: 70%;
        }
    </style>
</head>
<body>
    <div class="header">LOGO</div>
    <div class="body">
        <div class="menu">左侧菜单</div>
        <div class="content">
            {% block content %}{% endblock %}
        </div>
    </div>
</body>
</html>
m1.html
son1继承m1:
{% extends "master/m1.html" %}
{% block content %}
    <h1>666</h1>

    {% include "include/input_group.html" %}
    {% include "include/haha.html" %}
{% endblock %}

{% block title %}
    老男人
{% endblock %}
son1.html
son1同样继承include下的两个html文件内容;include防止在子html的什么位置,内容就显示在什么地方;

母版和include的应用场景:
母版:总体布局使用;include在局部功能上需要别的页面继承的时候使用:

views的内容:
#!/usr/bin/env python
#coding:utf-8
# Create your views here.
from django.shortcuts import render
from django.shortcuts import HttpResponse,render_to_response

def son(request):
    return render(request,\'son1.html\')
def home(request):
    #return HttpResponse
    #return render_to_response(request,\'home.html\')
    \'\'\'render内部找到home.html,读取html返回给用户\'\'\'
    dic ={\'name\':\'Charles\',\'age\':18,\'user_list\':{\'Charles\',\'wahaha\',\'Rain\'}}
    return render(request,\'home.html\',dic)
views
urls的内容:
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^home/\',views.home),
    url(r\'^son/\',views.son),
]
urls

Django静态文件的配置:
比如上面html母版中的CSs渲染的部分,需要放置到静态文件夹中,然后在母版中导入即可;
创建static静态文件夹

在settings中指明(需要一一对应)文件的路径

这样母版m1的内容就为:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="/static/css/commons.css"/>
    {% block css %}{% endblock %}             #也可以设置css文件的母版
</head>
<body>
    <div class="header">LOGO</div>
    <div class="body">
        <div class="menu">左侧菜单</div>
        <div class="content">
            {% block content %}{% endblock %}
        </div>
    </div>
    <script type="text/javascript">

    </script>
    {% block js %}{% endblock %}    #设置js文件的母版
</body>
</html>


commons.ss的内容为:
.clearfix:after{
    content: ".";
    visibility: hidden;
    display: block;
    height: 0;
    clear: both;
}
.header{
        height: 48px;
        background-color: red;
    }
    .body{
        background-color: #dddddd;
    }
    .body .menu{
        background-color: green;
        float: left;
        width: 2%;
    }
    .body .content{
        background-color: darkgoldenrod;
        float: left;
        width: 70%;
    }
m1.html
settings的内容如下:
STATIC_URL = \'/static/\'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,\'static\'),
)

整个程序访问流程如下:请求到url-->views-->templates中找html-->数据和html模板渲染-->得到字符串返回给用户


下面开发一个Django用户登录实例:
1、拷贝jQuery和bootstrap插件到静态文件目录下:

2、增加登录模块(html文件),增加表单的name

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="/static/css/commons.css"/>
    {% block css %}{% endblock %}             #也可以设置css文件的母版
</head>
<body>
    <div class="header">LOGO</div>
    <div class="body">
        <div class="menu">左侧菜单</div>
        <div class="content">
            {% block content %}{% endblock %}
        </div>
    </div>
    <script type="text/javascript">

    </script>
    {% block js %}{% endblock %}    #设置js文件的母版
</body>
</html>


commons.ss的内容为:
.clearfix:after{
    content: ".";
    visibility: hidden;
    display: block;
    height: 0;
    clear: both;
}
.header{
        height: 48px;
        background-color: red;
    }
    .body{
        background-color: #dddddd;
    }
    .body .menu{
        background-color: green;
        float: left;
        width: 2%;
    }
    .body .content{
        background-color: darkgoldenrod;
        float: left;
        width: 70%;
    }
login.html
3、views增加login函数
def login(request):
    #如果是get请求,get请求表示请求页面
    #如果是POST,检验用户输入;POST表示向页面提交内容
    print request.method
    if request.method == \'POST\':
        input_email=request.POST[\'email\']
        input_pwd = request.POST[\'pwd\']
        if input_email == \'Charles@qq.com\' and input_pwd == "123":
            from django.shortcuts import redirect
            return redirect("https://www.baidu.com")        #跳转到别的页面,如果想要跳转到别的函数,比如son,return redirect("/son/")
        else:
            return render(request,\'login.html\',{\'status\':\'用户名或密码错误\'})       #否则显示错误
    return render(request,\'login.html\')
views

4、urls的内容
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^home/\',views.home),
    url(r\'^son/\',views.son),
    url(r\'^login/\',views.login),
]
urls

model基本操作之增删改查
Django提供了ORM,可以使用类来创建数据库表和字段:

命令python manage.py makemigations 和python manage.py migrate可以创建数据表,生成0001.initial.py文件(注意都是在app01中操作的)
2、settings内容:
INSTALLED_APPS = [
\'django.contrib.admin\',
\'django.contrib.auth\',
\'django.contrib.contenttypes\',
\'django.contrib.sessions\',
\'django.contrib.messages\',
\'django.contrib.staticfiles\',
\'app01\', #注册该app
]
3、urls内容
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r\'^admin/\', include(admin.site.urls)),
    url(r\'^home/\',views.home),
    url(r\'^son/\',views.son),
    url(r\'^login/\',views.login),
    url(r\'^index/\',views.index),
]
urls
4、views中定义index函数:
#!/usr/bin/env python
#coding:utf-8
# Create your views here.
from django.shortcuts import render
from django.shortcuts import HttpResponse,render_to_response

def son(request):
    return render(request,\'son1.html\')
def home(request):
    #return HttpResponse
    #return render_to_response(request,\'home.html\')
    \'\'\'render内部找到home.html,读取html返回给用户\'\'\'
    dic ={\'name\':\'Charles\',\'age\':18,\'user_list\':{\'Charles\',\'wahaha\',\'Rain\'}}
    return render(request,\'home.html\',dic)

def login(request):
    #如果是get请求
    #如果是POST,检验用户输入
    print request.method
    if request.method == \'POST\':
        input_email=request.POST[\'email\']
        input_pwd = request.POST[\'pwd\']
        if input_email == \'Charles@qq.com\' and input_pwd == "123":
            from django.shortcuts import redirect
            return redirect("/index/")
        else:
            return render(request,\'login.html\',{\'status\':\'用户名或密码错误\'})
    return render(request,\'login.html\')

def index(request):
    #数据库取数据
    #数据和HTML渲染
    from app01 import models
    if request.method =="POST":
        input_em = request.POST[\'em\']
        input_pw = request.POST[\'pw\']
        models.UserInfo.objects.create(email=input_em,pwd=input_pw)    #增加数据

        #models.UserInfo.objects.filter(email=input_em).delete()       #删除数据
        #models.UserInfo.objects.filter(email=input_em).update(pwd=999)   #更新数据
    #获取UserInfo表中的所有的数据
    user_info_list = models.UserInfo.objects.all()    #查收,在模板中循环
    #user_info_list列表,列表的元素为一行;email,pwd;
    return render(request,\'index.html\',{\'user_info_list\':user_info_list})
views
4、模板index.html内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/index/" method="post">
        <input type="text" name="em"/>
        <input type="text" name="pw"/>
        <input type="submit" name="添加"/>
    </form>
    <table border="1">
        <thead>
            <tr>
                <th>邮箱</th>
                <th>密码</th>
            </tr>
        </thead>
        <tbody>
            {% for line in user_info_list %}
                <tr>
                    <td>{{ line.email }}</td>
                    <td>{{ line.pwd }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>
index.html


--权限登录管理系统
    1、登录(装饰器判断用户是否已经登录--可选,用户密码MD5)
    2、注册(检测用户是否已经存在,onblur+ajax光标跳出输入框时)
    3、注销(忽略)
    4、用户管理(From表单)
        重置密码
        创建用户(单条,批量)
        修改用户信息
    5、权限控制(可选)
        用户是否可以访问URL
作业

 

内容:
一、URL路由系统
二、中间件
三、Model:数据库的操作(重点)
1、创建表
2、操作表数据
四、Form(重点)
1、用户提交数据验证
2、生成html标签
五、cookie和session
六、跨站请求伪造和跨站脚本攻击
七、Ajax操作(重点)
八、Admin
九、缓存
十、自定义分页(重点)


下面分开介绍:

Django请求生命周期


路由系统详细介绍:

分页的概念:

点击是url发生变化;

那么如何实现分页:路由系统函数传参

1、urls的内容:
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^app01/\', include("app01.urls")),
    url(r\'^index/$\', views.index),
    #url(r\'^user_list/(\\d+)$\', views.user_list),             #django内部默认将url以/为分割线将url分割,传入参数,默认是按照顺序传入参数的
    #url(r\'^user_list/(\\d+)/(\\d+)$\', views.user_list),
    url(r\'^user_list/(?P<v1>\\d+)/(?P<v2>\\d+)$\', views.user_list),   #要灵活传入参数,设置(?P<v1>\\d+),v1表示key,传入的参数为value

    url(r\'^$\', views.index),          #放置到最后
]
urls
2、views的内容
from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
    return HttpResponse(\'OK\')

def user_list(request,v2,v1):           #将key传入
    print v1,v2
    return HttpResponse(v1+v2)
views

对于不同的app而言,如何实现输入url为app01的请求发送到app01上面:

1、urls的内容