• Django(一) 安装使用基础


    大纲

     安装Django 
    1、创建Django工程 
    2、创建Django app 
    3、写一个简单的登录注册相应页面 
    4、获取用户请求信息并处理 
    5、前后端交互 
    6、Django 请求 生命周期 
      跳转到这里 
    7、django内容整理

    安装Django

    pip3 install django             #python2.x 使用   `pip insall 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 127.0.0.1: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/lgeng")
            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':'lgeng', '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中)。渲染或组合,最终生成字符串返回给用户

    转载请务必保留此出处:http://www.cnblogs.com/lgeng/p/7363852.html


    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': "lgeng"})

    index.html
     <html>
       ..
           <body>
                <div>{{current_user}}</div>
          </body>
    
    </html>
    ====> 最后生成的字符串,返回给用户
       <html>
          ..
              <body>
                     <div>lgeng</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>

    <!--   END  -->

    《版权说明》-- 本文转自: http://blog.csdn.net/fgf00/articdetails/53522613

  • 相关阅读:
    springboot中MongoDB的使用
    SpringBoot中发送邮件服务
    springboot中使用RabbitMq
    PostgreSQL学习之【用户权限管理】说明
    Leet Code 19.删除链表的倒数第N个节点
    Kafka集群搭建
    Leet Code 18.四数之和
    Hadoop集群运行情况
    完全分布式Hadoop集群搭建
    Leet Code 17.电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/lgeng/p/7363852.html
Copyright © 2020-2023  润新知