zoukankan      html  css  js  c++  java
  • Django框架


    title: Django框架
    tags: Django

    1 自己开发Web框架

    开发Web框架涉及的内容

    • socket

    • http协议

      无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了

    • HTML知识

    • 数据库(pymysql,SQLAlchemery)

    互联网的通信都是基于sock进行通信的
    HTTP:无状态、短连接
    TCP:不断开
    WEB应用(网站):

    HTTP协议:

    发送:
    				POST /index HTTP/1.1
    				Host: 127.0.0.1:8080
    				Connection: keep-alive
    				Cache-Control: max-age=0
    				Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    				User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
    				HTTPS: 1
    				Accept-Encoding: gzip, deflate, sdch
    				Accept-Language: zh-CN,zh;q=0.8
    				Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni
    
    
    				p=123
    			
    响应:
    				200 OK
    				Cache-Control:public, max-age=15
    				Connection:keep-alive
    				Content-Encoding:gzip
    				Content-Type:text/html; charset=utf-8
    				Date:Wed, 14 Jun 2017 01:21:17 GMT
    				Expires:Wed, 14 Jun 2017 01:21:33 GMT
    				Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
    				Transfer-Encoding:chunked
    				Vary:Accept-Encoding
    				X-Frame-Options:SAMEORIGIN
    				X-UA-Compatible:IE=10
    						
    				
    				
    				用户在页面看到的内容“字符串”(看到页面效果,由于浏览器解析)
    

    浏览器(socket客户端)
    2. www.cnblogs.com (42.121.252.58,80)
    sk.socket()
    sk.connect((42.121.252.58,80))

    			sk.send('我想要xx')
    		5. 接收
    		6. 连接断开
    

    博客园(socket服务端)
    1. 监听ip和端口(42.121.252.58,80)
    while True:
    用户 = 等待用户连接
    3. 收到'我想要xx'
    4. 响应:“好”
    用户断开

    下面的代码构成了一个简单的web框架:

    import socket
    
    sock = socket.socket()
    sock.bind(('127.0.0.1',8080))
    sock.listen(5)
    
    while True:
        conn,addr = sock.accept() # hang住
        # 有人来连接了
        # 获取用户发送的数据
        data = conn.recv(8096)
        conn.send(b"HTTP/1.1 200 OK
    
    ")
        conn.send(b'123123')
        conn.close()
    

    2 Django 框架配置

    2.1 新建Django工程

    2.1.1 在cmd中建立工程

    django-admin startproject 工程名
    Python3 manage.py runserver

    2.2 设置HTML模板路径

    新建HTML的模板存放的文件templates,之后在setting配置文件中添加templates的路径:

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

    2.3 配置静态文件路径

    静态文件包括css文件,js文件,图片等
    新建静态文件static(可以是别的名字),在setting文件中添加

    STATIC_URL = '/static/'
    STATICFILES_DIRS =(
        os.path.join(BASE_DIR,'static'), #这里是拼接存放css文件的路径,修改路径的名字时,会自动修改
    )
    

    注意:

    • 拼接路径,最后用逗号,否则会报错
    • 这里的static代表前缀,在HTML文件中引入css文件的时候在前面添加,
    <link rel="stylesheet" href="/static/comments.css"> 这里的static是前缀
    

    2.4注释一句

    这里先把setting中下面的一句话注释

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    

    2.5 django工程目录

    mysite
       | - mysite    ===============对整个程序进行配置
          |  - __init__.py
          |  - settings.py    ============配置文件
          |  - url.py        ==============URL对应关系
          |  - wsgi.py        ============遵循WSGI规范,上线一般使用uwsgi+nginx
       | - manage.py    ============管理Django程序    : python manage.py
                                                                : python manage.py startapp xxx
                                                                : python manage.py makemigrations
                                                                : python manage.py migrate
    
     
    

    3 Django 路由系统

    路由系统是对URL进行的配置,urls.py文件中进行操作

    from django.shortcuts import HttpResponse,render
    
    def login(request):  
    	# 需要加参数request,拿到所有的内容
        return HttpResponse('hello') # 封装的对象  直接返回内容
    
    def index(request): 
        return render(request,'index.html')# render 加request参数和HTML文件
    
    urlpatterns = [
        #url(r'^admin/', admin.site.urls),
        url(r'^login/', login),
        url(r'^index/', index), # index是函数名
    ]
    

    4 模板标记

    HTML文件在django中是作为模板使用的,因为涉及数据的交互,所以是动态的,通常是把内容添加到HTML中。在HTML中是通过特殊符号进行占位的,称为模板标记。

    模板的原理是:http是传输的过程中国是通过响应头和相应体进行通信的。中间是两个换行符。传输的是字节,模板是通过字符拼接的,形成完整的响应体

    在django中是通过{{ }}对模板进行添加的

    添加的方式:

    • 通过字典的方式
    • 通过列表取,索引用. 的方法
    • 通过for循环取

    能够和HTML结合起来使用

    <body>
        <h1>index</h1>
        <p>{{ name }}</p>
        <p>{{ users.0 }}</p>
        <p>{{ users.1 }}</p>
        <p>{{ user_dict.k1 }}</p>
        <p>{{ user_dict.k2 }}</p>
        <p>循环</p>
        <ul>
            {% for item in users %}
                <li>{{ item }}</li>
            {% endfor %}
        </ul>
    
        <table border="1px">
            {% for row in user_list_dict %}
                <tr>
                    <td>{{ row.id }}</td>
                    <td>{{ row.name }}</td>
                    <td>{{ row.email }}</td>
                    <td>
                        <a href="">编辑</a> |<a href="/del/?nid={{ row.id }}">删除</a>
                    </td>
                </tr>
    
            {% endfor %}
    
        </table>
    
    
    </body>
    
    def index(request):
        return render(request, 'index.html',
                      {
                          'name':'abc',
                          'users':['aaa','bbb'],
                          'user_dict':{'k1':'v1','k2':'v2'},
                          'user_list_dict':[
                              {'id':1,'name':'aaa','email':'aaa@aaa.com'},
                              {'id':2,'name':'bbb','email':'bbb@bbb.com'},
                              {'id':3,'name':'ccc','email':'ccc@ccc.com'},
                          ]
    
                      })
    
    

    return redirect('/index/') # 重定向才行 上面不行
    使用render跳转不行

    参考内容:

    http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html

    https://my.oschina.net/asktao/blog/894367

    http://www.cnblogs.com/wupeiqi/articles/5237704.html

  • 相关阅读:
    [SQL Server] sysobjects的介紹
    [R] [Johns Hopkins] R Programming -- week 3
    [R] 繪圖 Par 函数
    [R] [Johns Hopkins] R Programming -- week 4
    [Ms SQL] 基本創建、修改與刪除
    [R] Lexical & Dynamic Scoping / Execution & Calling environments / Closures
    [R] [Johns Hopkins] R Programming 作業 Week 2
    Python之路【第十七篇】:Django【进阶篇 】
    Django之Form组件
    Python之路【第十六篇】:Django【基础篇】
  • 原文地址:https://www.cnblogs.com/Python666/p/7009508.html
Copyright © 2011-2022 走看看