安装Django

pip3 install django

windows安装后,添加Django安装路径的环境变量。

1、创建Django工程

django-admin startproject 【工程名称】
# 生成目录结构如下
    mysite
        - mysite        # 对整个程序进行配置
            - __init__.py
            - settings.py  # 配置文件
            - urls.py      # URL对应关系
            - wsgi.py      # 遵循WSGI规范,一般使用 uwsgi + nginx
        - manage.py        # 管理Django程序:如下
                  - python manage.py  # 运行程序
                  - python manage.py startapp xx  # 创建app
                  # Django的orm框架
                  - python manage.py makemigrations  
                  - python manage.py migrate

SGI本质上就是一个封装了socket的模块,调用接口就可以。

  • 运行Django功能
python manage.py  # 或如下
python manage.py runserver 0.0.0.0:8000

通过pycharm 也能创建django程序。

写一个基本完整的http请求

编辑urls.py 文件

from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse  # Http相应

def home(request):
    return HttpResponse('<h1>Hello</h1>')

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^h.html/', home),
]

 

启动后,访问:127.0.0.1:8000/h.html/

不过实际中,上面的home相当于一个业务功能,而不同的功能,在django中可以分别创建不同的app。

2、创建Django app

  • 创建app
python manage.py startapp cmdb

把home函数移到cmdb\views.py中,

from django.shortcuts import HttpResponse

def home(request):
    return HttpResponse('<h1>Hello</h1>')

urls.py修改如下:

from django.conf.urls import url
from django.contrib import admin
from cmdb import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^h.html/', views.home),
]
  • app目录结构
migrations     # django orm框架,修改表结构的操作记录(差异化)
__init__       # python3中有没有都一样,python2中必须有
admin          # Django为我们提供的后台管理
apps           # 配置当前app
models         # ORM:写指定的类,通过命令可以创建数据库结构
tests          # 单元测试
views          # ****业务代码****

3、写一个简单的登录注册相应页面

新建一个templates 文件夹,用来存放html模板文件

views.py

# from django.shortcuts import HttpResponse
from django.shortcuts import render  # django帮我们打开文件并相应的模块
# 因为经常返回数据,打开文件,所以django使用render模块,做这个事情。

def login(request):
    # with open("templates/login.html", "r", encoding="utf-8") as f:
    #     data = f.read()
    # return HttpResponse(data)
    return render(request, 'login.html')
    # 这里没有指定路径,在settings配置里,默认就已添加templates

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        label{
            width: 80px;
            text-align: right;
            display: inline-block;
        }
    </style>
</head>
<body>
    <form action="/login" method="post">
        <p>
            <label for="username">用户名:</label>
            <input id="username" type="text" />
        </p>
        <p>
            <label for="password">密码:</label>
            <input id="password" type="text" />
            <input type="submit" value="提交" />
        </p>
    </form>
</body>
</html>

 

  • js、css静态文件处理

页面里可能会包含css、js文件,这些静态文件也需要引入进来。

创建静态文件目录static,创建完之后还要在settings里面配置一下,最后面添加:

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),  # 必须加上都好“,” 不加就报错
)

login.html 文件中引入css、js

<link rel="stylesheet" href="/static/commons.css">

总结:

创建完project后,优先做几件事:

1、配置模板的路径

settings.py

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',
                ],
            },
        },
    ]

 

2、配置静态目录

# 创建static目录

# settings 最后添加静态文件配置
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
# html模板文件引用css、js
<link rel="stylesheet" href="/static/commons.css" />

4、获取用户请求信息并处理

  • 注释掉CSRF

CSRF: 跨站请求伪造

后面会讲,这里先注释上,不然会报错

settings —> 找到MIDDLEWARE —> 注释掉

# 'django.middleware.csrf.CsrfViewMiddleware',

  • request 包含了客户端发来的所有信息。

客户端发过来的信息,内部django、wsgi帮我们处理,处理之后会给我们一个结果。把客户端所有的信息打包然后发给我,怎么发呢?

就是上面函数形参 request :包含了客户端用户发来的所有信息。

比如:request.method就是用户提交方式(get、post)。往往get获取表单;post方式提交数据。

form表单提交的时候,以类似字典的形式提交,所以要在html form里定义name

from django.shortcuts import render  # django帮我们打开文件并返回给用户
from django.shortcuts import redirect  # 重定向、跳转

def login(request):
    # request 包含用户提交的所有信息
    error_msg = ''
    if request.method == "POST":  # request.method 用户提交方法
        # request.POST 用户通过POST提交过来的数据
        user = request.POST.get('user', None)
        pwd = request.POST.get('pwd', None)  # 不存在为None

        if user == 'root' and pwd == '123':  # 用户跳转
            return redirect("http://blog.csdn.net/fgf00")
        else:  # 用户名密码错误。
            error_msg = "用户名或密码错误"
    return render(request, 'login.html', {"error_msg":error_msg})
    # "error_msg:网页中定义的特殊文本,key"
  • Django模版语言

用户名密码错误,怎么给用户返回数据?

需要借助另外一件事:在模板里面,在Django里面可以写一些特殊的内容。

{{ }} Django 对其进行替换。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/commons.css">
    <style>
        label{
            width: 80px;
            text-align: right;
            display: inline-block;
        }
    </style>
</head>
<body>
    <form action="/login/" method="post">
    {#    action="/home":提交到http://127.0.0.1/home/    #}
        <p>
            <label for="username">用户名:</label>
            <input id="username" name="user" type="text" />
        </p>
        <p>
            <label for="password">密码:</label>
            <input id="password" name="pwd" type="password" />
            <input type="submit" value="提交1" />
            <span style="color: red">{{ error_msg }}</span>
            {#      Django里面可以写一些特殊的内容,后台进行替换      #}
        </p>
    </form>
</body>
</html>

 

注意:网页action提交那里action="/login/",要和urls.py 里url(r'^login/', views.login),保持一致!!!

要是login/全是login/,要是login全是login,否则点击提交会报错:

RuntimeError at /login
You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/login/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

web框架中,之后Django中会报这个错。

PS:配置过程中,可能会种种原因遇到报错,这时候可以从django相应的过程中,逐步排查,最终找到错误点

5、前后端交互

urls.py :url(r'^home', views.home),

views.py

from django.shortcuts import render  
USER_LIST = [
    {'user':'alex', 'email': 'a.126.com', 'gender': "男"},
    {'user':'lily', 'email': 'a.126.com', 'gender': "女"},
    {'user':'fgf', 'email': 'a.126.com', 'gender': "男"},
]
def home(request):
    if request.method == "POST":
        u = request.POST.get('username')
        e = request.POST.get('email')
        g = request.POST.get('gender')
        temp = {'username':u, 'email':e, 'gender':g}
        USER_LIST.append(temp)
    return render(request, "home.html", {'user_list':USER_LIST})

 

templates/home.html

  • 注意下:django 模板语言for循环写法
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body style="margin: 0">
    <div style="height: 48px;</div>
    <div>
        <form action="/home" method="post">
            <input type="text" name="username" placeholder="用户名" />
            <input type="text" name="email"  placeholder="邮箱"/>
            <input type="text" name="gender"  placeholder="性别"/>
            <input type="submit" value="添加" />
        </form>
    </div>
    <div>
        <table>
            {#  django 模板语言for循环 (user_list:后端定义的全局变量) #}
            {% for row in user_list %}
                <tr>
                    {#  这里row代表字典,去索引用row.email,而不是row['email']  #}
                    <td>{{ row.username }}</td>
                    <td>{{ row.gender }}</td>
                    <td>{{ row.email }}</td>
                </tr>
            {% endfor %}
        </table>
    </div>
</body>
</html>

6、Django 请求 生命周期

  • 1)客户端请求
  • 2)路由系统:urls.py,路由关系映射
  • 3)视图函数:app/views.py,功能函数
  • 4)视图函数从DB等取数据,并嵌套到html中(html模板templates中)。渲染或组合,最终生成字符串返回给用户

 


 

7、django内容整理

  • 配置
    1. 创建Django工程
            django-admin startproject 工程名

    2. 创建APP
        cd 工程名
        python manage.py startapp cmdb

    3、静态文件
        project.settings.py

        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )

    4、模板路径

        DIRS ==>    [os.path.join(BASE_DIR,'templates'),]

    5、settings中

        middlerware

            # 注释 csrf

 

  • 使用
    6、定义路由规则
        urls.py

            "login" --> 函数名

    7、定义视图函数
        app下views.py

            def func(request):
                # request.method   GET / POST
            # 获取数据  
                # http://127.0.0.1:8009/home?nid=123&name=alex
                # request.GET.get('',None)   # 获取请求发来的数据

                # request.POST.get('',None)

            # 返回数据  
                # return HttpResponse("字符串")
                # return render(request, "HTML模板的路径")
                # return redirect('/只能填URL')
                # 只返回url地址,让客户端再次请求,不会把跳转的数据发给客户端
                # redirect('/login')  前面的"/"代指本地url,前面的域名端口

 

  • 模板渲染
    8、模板渲染
        特殊的模板语言

        -- {{ 变量名 }}

            views.py

                def func(request):
                    return render(request, "index.html", {'current_user': "fgf"})

            index.html

                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                    </body>

                </html>

            ====> 最后生成的字符串,返回给用户

                <html>
                ..
                    <body>
                        <div>fgf</div>
                    </body>

                </html>

        -- For循环

            views.py

                def func(request):
                    return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']})


            index.html

                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>

                        <ul>
                            {% for row in user_list %}

                                {% if row == "alex" %}
                                    <li>{{ row }}</li>
                                {% endif %}

                            {% endfor %}
                        </ul>

                    </body>
                </html>

        ###索引################# 

                def func(request):
                    return render(request, "index.html", {
                                'current_user': "alex", 
                                'user_list': ['alex','eric'], 
                                'user_dict': {'k1': 'v1', 'k2': 'v2'}})

            index.html

                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>

                        <a> {{ user_list.1 }} </a>  # 取列表
                        <a> {{ user_dict.k1 }} </a> # 取字典
                        <a> {{ user_dict.k2 }} </a>

                    </body>

                </html>

        ###### 条件

                def func(request):
                    return render(request, "index.html", {
                                'current_user': "alex", 
                                "age": 18,
                                'user_list': ['alex','eric'], 
                                'user_dict': {'k1': 'v1', 'k2': 'v2'}})

            index.html

                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>

                        <a> {{ user_list.1 }} </a>
                        <a> {{ user_dict.k1 }} </a>
                        <a> {{ user_dict.k2 }} </a>

                        {% if age %}
                            <a>有年龄</a>
                            {% if age > 16 %}
                                <a>老</a>
                            {% else %}
                                <a>少</a>
                            {% endif %}
                        {% else %}
                            <a>无年龄</a>
                        {% endif %}
                    </body>
                </html>
posted on 2018-01-24 21:21  Py行僧  阅读(100)  评论(0编辑  收藏  举报