django配置*app*登陆案例*orm简用

 

 

1.静态文件的配置和使用

1.静态文件的配置和使用

 

没有css样式:css

添加样式html

 

结果:前端

<html lang="en">
<head>
    <meta charset="utf-8">

    <title>Signin Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <link href="../../assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="signin.css" rel="stylesheet">

    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
    <script src="../../assets/js/ie-emulation-modes-warning.js"></script>

  </head>
<body>

    <div class="container">

      <form class="form-signin">
        <h2 class="form-signin-heading">Please sign in</h2>
        <label for="inputEmail" class="sr-only">Email address</label>
        <input type="email" id="inputEmail" class="form-control" placeholder="Email address" required="" autofocus="">
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" id="inputPassword" class="form-control" placeholder="Password" required="">
        <div class="checkbox">
          <label>
            <input type="checkbox" value="remember-me"> Remember me
          </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
      </form>

    </div> <!-- /container -->


    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="../../assets/js/ie10-viewport-bug-workaround.js"></script>


</body>
</html>
index.html

<html lang="en">
<head>
    <meta charset="utf-8">

    <title>Signin Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <link href="../../assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="signin.css" rel="stylesheet">

    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
    <script src="../../assets/js/ie-emulation-modes-warning.js"></script>

  </head>
<body>

    <div class="container">

      <form class="form-signin">
        <h2 class="form-signin-heading">请登陆:</h2>
        <label for="inputEmail" class="sr-only">Email address</label>
        <input type="text" id="inputEmail" class="form-control" placeholder="用户名" required="" autofocus="">
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" id="inputPassword" class="form-control" placeholder="密码" required="">
        <div class="checkbox">
          <label>
            <input type="checkbox" value="remember-me"> 记住密码
          </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
      </form>

    </div> <!-- /container -->


    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="../../assets/js/ie10-viewport-bug-workaround.js"></script>


</body>
</html>
index.html
body {
  padding-top: 40px;
  padding-bottom: 40px;
  background-color: #eee;
}

.form-signin {
  max-width: 330px;
  padding: 15px;
  margin: 0 auto;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
  margin-bottom: 10px;
}
.form-signin .checkbox {
  font-weight: normal;
}
.form-signin .form-control {
  position: relative;
  height: auto;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
  padding: 10px;
  font-size: 16px;
}
.form-signin .form-control:focus {
  z-index: 2;
}
.form-signin input[type="email"] {
  margin-bottom: -1px;
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
}
.form-signin input[type="password"] {
  margin-bottom: 10px;
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}
signin.css

如今是直接本地打开的登陆页面,咱们应该是访问网页时才打开网页:java

settings最后面有个配置  是静态页面存放的目录别名  STATIC_URL = '/static/'python

STATIC_URL = '/static/'   # 别名,浏览器上访问的是别名static,找资源是从STATICFILES_DIRS里面找,不是用static1,2访问,可是能访问到这些目录下的静态文件
STATICFILES_DIRS = [        #若是静态文件放到这些目录下,而且外接引入css,那么访问别名static的时候就能将这里面样式连接使用出来。
    os.path.join(BASE_DIR, 'static1'), #static下有css,js,img,插件等等目录。
    os.path.join(BASE_DIR, 'static'),  #若是多个静态目录中相同路径有相同的文件,那么从这里按顺序往下找,使用找到的第一个文件。前面的目录中优先使用。
    os.path.join(BASE_DIR, 'static2'),
]
<link rel="stylesheet" href="/static/css/login.css"> # 别名开头   连接使用,路径从跟开始

按照STATICFILES_DIRS列表的顺序进行查找。mysql

个人理解是,django框架中,函数render首页文件,也会将静态文件发送到浏览器上,而后浏览器上根据这些文件就能完整展现页面的样式。web

修改样式等内容后,防止缓存对调试产生影响,勾选不使用缓存sql

 

 

有些使用的网上别人写好的,将路径修改正确,举个栗子若是背景图没有,在index.html中也没有看到哪里使用的背景图,那么可能在别处引用了。这里的案例是在一个css文件中,能够在其它文件中ctrl+f查找这个背景图的名字,将这个背景图的src改成当前的正确路径,背景图就出来了。数据库

 

若是引入静态文件目录中的文件,src必须是别名,而不是目录名字。不然控制台报错找不到资源。django

 即便三个图片在三个不一样的设置的静态文件目录中,可是引入时都用别名开头,那么才能正确使用资源。

按照STATICFILES_DIRS列表的顺序进行查找。

 

 

2.简单的登陆的实例

form表单提交数据注意的问题:

1. 提交的地址action="" 请求的方式 method="post"
2. 全部的input框有name属性
3. 有一个input框的type="submit" 或者 有一个button

提交POST请求,把settings中MIDDLEWARE的'django.middleware.csrf.CsrfViewMiddleware'注释掉

 

这里写了用户名密码,点击登陆以后应该登陆才对,这里只是这个页面刷新了一下:地址栏也多了个问号,这是发送了一个get请求

<input type="text" id="inputEmail" class="form-control" placeholder="用户名" required="" autofocus="">

required=''''表示这一个必填

1. 提交的地址action="" 请求的方式 method="post",默认是get请求,提交到当前的地址,那么不用写地址

2. 全部的input框有name属性,这样能够取form表单中的键值对
3. 有一个input框的type="submit" 或者 有一个button,做为提价用。

<html lang="en">
<head>
    <meta charset="utf-8">
    <title>魔降风云变</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <link href="/static/css/signin.css" rel="stylesheet">

  </head>
<body>
    <div class="container">

      <form class="form-signin" action="" method="post" >
        <h2 class="form-signin-heading">请登陆:</h2>
        <label for="inputEmail" class="sr-only">Email address</label>
        <input type="text" id="inputEmail" class="form-control" placeholder="用户名" required="" autofocus="" name="username">
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" id="inputPassword" class="form-control" placeholder="密码" required="" name="passwd">
        <div class="checkbox">
          <label>
            <input type="checkbox" value="remember-me"> 记住密码
          </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit" name="submit">登陆</button >
      </form>

    </div> <!-- /container -->


    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="../../assets/js/ie10-viewport-bug-workaround.js"></script>


</body>
</html>
View Code

而后写入信息点击提交,提交以后显示403禁止

 

这个的缘由是django的css校验。暂时不用管,进入settings中将中间件中的关于csrf的注释掉。

而后再点击登陆,就会刷新登陆页面

由于函数里面么有区分,不管post仍是get请求都返回的这个页面

实际应该是若是是post请求,就返回的是别的东西了。

那么打印一下request是什么:

def login(request):
    print(request)
    return render(request,'login.html')
--------------结果:
<WSGIRequest: POST '/login/'>  #当我登陆提交的时候是post,一个类
<WSGIRequest: GET '/login/'>  #当我登陆的时候是get


<WSGIRequest: GET '/login/'> <class 'django.core.handlers.wsgi.WSGIRequest'>

那么在函数中根据浏览器的请求方式,返回不一样的内容

from  django.shortcuts import render
def login(request):
    if request.method=='get':
        return render(request, 'login.html')
    else:
        print(request.method,type(request.method)) #GET <class 'str'>

以下报错是没有返回对象 The view Django02.urls.login didn't return an HttpResponse object. It returned None instead.

ValueError at /login/
The view Django02.urls.login didn't return an HttpResponse object. It returned None instead.
Request Method:    GET
Request URL:    http://127.0.0.1:8000/login/
Django Version:    1.11.21
Exception Type:    ValueError
Exception Value:    
The view Django02.urls.login didn't return an HttpResponse object. It returned None instead.
Exception Location:    C:\python3\lib\site-packages\django\core\handlers\base.py in _get_response, line 198
Python Executable:    C:\python3\python3.exe
Python Version:    3.6.8
Python Path:    
['C:\\mcw\\Django02',
 'C:\\mcw\\Django02',
 'C:\\python3\\python36.zip',
 'C:\\python3\\DLLs',
 'C:\\python3\\lib',
 'C:\\python3',
 'C:\\python3\\lib\\site-packages',
 'C:\\软件安装\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend']
Server time:    Wed, 12 Jun 2019 08:57:00 +0000
Traceback Switch to copy-and-paste view
C:\python3\lib\site-packages\django\core\handlers\exception.py in inner
            response = get_response(request) ...
▶ Local vars
C:\python3\lib\site-packages\django\core\handlers\base.py in _get_response
                "returned None instead." % (callback.__module__, view_name) ...
▶ Local vars
Request information
USER
AnonymousUser

GET
No GET data

POST
No POST data

FILES
No FILES data

COOKIES
No cookie data

META
Variable    Value
ALLUSERSPROFILE    
'C:\\ProgramData'
APPDATA    
'C:\\Users\\Administrator\\AppData\\Roaming'
COMMONPROGRAMFILES    
'C:\\Program Files (x86)\\Common Files'
COMMONPROGRAMFILES(X86)    
'C:\\Program Files (x86)\\Common Files'
COMMONPROGRAMW6432    
'C:\\Program Files\\Common Files'
COMPUTERNAME    
'PC-20190328RVNA'
COMSPEC    
'C:\\Windows\\system32\\cmd.exe'
CONTENT_LENGTH    
''
CONTENT_TYPE    
'text/plain'
DJANGO_SETTINGS_MODULE    
'Django02.settings'
FP_NO_HOST_CHECK    
'NO'
GATEWAY_INTERFACE    
'CGI/1.1'
HOMEDRIVE    
'C:'
HOMEPATH    
'\\Users\\Administrator'
HTTP_ACCEPT    
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'
HTTP_ACCEPT_ENCODING    
'gzip, deflate, br'
HTTP_ACCEPT_LANGUAGE    
'zh-CN,zh;q=0.9'
HTTP_CACHE_CONTROL    
'no-cache'
HTTP_CONNECTION    
'keep-alive'
HTTP_HOST    
'127.0.0.1:8000'
HTTP_PRAGMA    
'no-cache'
HTTP_UPGRADE_INSECURE_REQUESTS    
'1'
HTTP_USER_AGENT    
('Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like '
 'Gecko) Chrome/74.0.3729.169 Safari/537.36')
LOCALAPPDATA    
'C:\\Users\\Administrator\\AppData\\Local'
LOGONSERVER    
'\\\\PC-20190328RVNA'
NUMBER_OF_PROCESSORS    
'4'
OS    
'Windows_NT'
PATH    
'C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\软件安装\\Git\\cmd;C:\\mysql\\mysql-5.6.44-winx64\\bin;C:\\python3\\Scripts\\;C:\\python3\\'
PATHEXT    
'.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'
PATH_INFO    
'/login/'
PROCESSOR_ARCHITECTURE    
'x86'
PROCESSOR_ARCHITEW6432    
'AMD64'
PROCESSOR_IDENTIFIER    
'Intel64 Family 6 Model 58 Stepping 9, GenuineIntel'
PROCESSOR_LEVEL    
'6'
PROCESSOR_REVISION    
'3a09'
PROGRAMDATA    
'C:\\ProgramData'
PROGRAMFILES    
'C:\\Program Files (x86)'
PROGRAMFILES(X86)    
'C:\\Program Files (x86)'
PROGRAMW6432    
'C:\\Program Files'
PSMODULEPATH    
'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\'
PUBLIC    
'C:\\Users\\Public'
PYCHARM_HOSTED    
'1'
PYCHARM_MATPLOTLIB_PORT    
'57596'
PYTHONIOENCODING    
'UTF-8'
PYTHONPATH    
('C:\\mcw\\Django02;C:\\软件安装\\PyCharm '
 '2018.3.5\\helpers\\pycharm_matplotlib_backend')
PYTHONUNBUFFERED    
'1'
QUERY_STRING    
''
REMOTE_ADDR    
'127.0.0.1'
REMOTE_HOST    
''
REQUEST_METHOD    
'GET'
RUN_MAIN    
'true'
SCRIPT_NAME    
''
SERVER_NAME    
'PC-20190328RVNA'
SERVER_PORT    
'8000'
SERVER_PROTOCOL    
'HTTP/1.1'
SERVER_SOFTWARE    
'WSGIServer/0.2'
SESSIONNAME    
'Console'
SYSTEMDRIVE    
'C:'
SYSTEMROOT    
'C:\\Windows'
TEMP    
'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp'
TMP    
'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp'
USERDOMAIN    
'PC-20190328RVNA'
USERNAME    
'Administrator'
USERPROFILE    
'C:\\Users\\Administrator'
WINDIR    
'C:\\Windows'
WINDOWS_TRACING_FLAGS    
'3'
WINDOWS_TRACING_LOGFILE    
'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log'
wsgi.errors    
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
wsgi.file_wrapper    
''
wsgi.input    
<_io.BufferedReader name=580>
wsgi.multiprocess    
False
wsgi.multithread    
True
wsgi.run_once    
False
wsgi.url_scheme    
'http'
wsgi.version    
(1, 0)
Settings
Using settings module Django02.settings
Setting    Value
ABSOLUTE_URL_OVERRIDES    
{}
ADMINS    
[]
ALLOWED_HOSTS    
[]
APPEND_SLASH    
True
AUTHENTICATION_BACKENDS    
['django.contrib.auth.backends.ModelBackend']
AUTH_PASSWORD_VALIDATORS    
'********************'
AUTH_USER_MODEL    
'auth.User'
BASE_DIR    
'C:\\mcw\\Django02'
CACHES    
{'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
CACHE_MIDDLEWARE_ALIAS    
'default'
CACHE_MIDDLEWARE_KEY_PREFIX    
'********************'
CACHE_MIDDLEWARE_SECONDS    
600
CSRF_COOKIE_AGE    
31449600
CSRF_COOKIE_DOMAIN    
None
CSRF_COOKIE_HTTPONLY    
False
CSRF_COOKIE_NAME    
'csrftoken'
CSRF_COOKIE_PATH    
'/'
CSRF_COOKIE_SECURE    
False
CSRF_FAILURE_VIEW    
'django.views.csrf.csrf_failure'
CSRF_HEADER_NAME    
'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS    
[]
CSRF_USE_SESSIONS    
False
DATABASES    
{'default': {'ATOMIC_REQUESTS': False,
             'AUTOCOMMIT': True,
             'CONN_MAX_AGE': 0,
             'ENGINE': 'django.db.backends.sqlite3',
             'HOST': '',
             'NAME': 'C:\\mcw\\Django02\\db.sqlite3',
             'OPTIONS': {},
             'PASSWORD': '********************',
             'PORT': '',
             'TEST': {'CHARSET': None,
                      'COLLATION': None,
                      'MIRROR': None,
                      'NAME': None},
             'TIME_ZONE': None,
             'USER': ''}}
DATABASE_ROUTERS    
[]
DATA_UPLOAD_MAX_MEMORY_SIZE    
2621440
DATA_UPLOAD_MAX_NUMBER_FIELDS    
1000
DATETIME_FORMAT    
'N j, Y, P'
DATETIME_INPUT_FORMATS    
['%Y-%m-%d %H:%M:%S',
 '%Y-%m-%d %H:%M:%S.%f',
 '%Y-%m-%d %H:%M',
 '%Y-%m-%d',
 '%m/%d/%Y %H:%M:%S',
 '%m/%d/%Y %H:%M:%S.%f',
 '%m/%d/%Y %H:%M',
 '%m/%d/%Y',
 '%m/%d/%y %H:%M:%S',
 '%m/%d/%y %H:%M:%S.%f',
 '%m/%d/%y %H:%M',
 '%m/%d/%y']
DATE_FORMAT    
'N j, Y'
DATE_INPUT_FORMATS    
['%Y-%m-%d',
 '%m/%d/%Y',
 '%m/%d/%y',
 '%b %d %Y',
 '%b %d, %Y',
 '%d %b %Y',
 '%d %b, %Y',
 '%B %d %Y',
 '%B %d, %Y',
 '%d %B %Y',
 '%d %B, %Y']
DEBUG    
True
DEBUG_PROPAGATE_EXCEPTIONS    
False
DECIMAL_SEPARATOR    
'.'
DEFAULT_CHARSET    
'utf-8'
DEFAULT_CONTENT_TYPE    
'text/html'
DEFAULT_EXCEPTION_REPORTER_FILTER    
'django.views.debug.SafeExceptionReporterFilter'
DEFAULT_FILE_STORAGE    
'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL    
'webmaster@localhost'
DEFAULT_INDEX_TABLESPACE    
''
DEFAULT_TABLESPACE    
''
DISALLOWED_USER_AGENTS    
[]
EMAIL_BACKEND    
'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST    
'localhost'
EMAIL_HOST_PASSWORD    
'********************'
EMAIL_HOST_USER    
''
EMAIL_PORT    
25
EMAIL_SSL_CERTFILE    
None
EMAIL_SSL_KEYFILE    
'********************'
EMAIL_SUBJECT_PREFIX    
'[Django] '
EMAIL_TIMEOUT    
None
EMAIL_USE_LOCALTIME    
False
EMAIL_USE_SSL    
False
EMAIL_USE_TLS    
False
FILE_CHARSET    
'utf-8'
FILE_UPLOAD_DIRECTORY_PERMISSIONS    
None
FILE_UPLOAD_HANDLERS    
['django.core.files.uploadhandler.MemoryFileUploadHandler',
 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE    
2621440
FILE_UPLOAD_PERMISSIONS    
None
FILE_UPLOAD_TEMP_DIR    
None
FIRST_DAY_OF_WEEK    
0
FIXTURE_DIRS    
[]
FORCE_SCRIPT_NAME    
None
FORMAT_MODULE_PATH    
None
FORM_RENDERER    
'django.forms.renderers.DjangoTemplates'
IGNORABLE_404_URLS    
[]
INSTALLED_APPS    
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
INTERNAL_IPS    
[]
LANGUAGES    
[('af', 'Afrikaans'),
 ('ar', 'Arabic'),
 ('ast', 'Asturian'),
 ('az', 'Azerbaijani'),
 ('bg', 'Bulgarian'),
 ('be', 'Belarusian'),
 ('bn', 'Bengali'),
 ('br', 'Breton'),
 ('bs', 'Bosnian'),
 ('ca', 'Catalan'),
 ('cs', 'Czech'),
 ('cy', 'Welsh'),
 ('da', 'Danish'),
 ('de', 'German'),
 ('dsb', 'Lower Sorbian'),
 ('el', 'Greek'),
 ('en', 'English'),
 ('en-au', 'Australian English'),
 ('en-gb', 'British English'),
 ('eo', 'Esperanto'),
 ('es', 'Spanish'),
 ('es-ar', 'Argentinian Spanish'),
 ('es-co', 'Colombian Spanish'),
 ('es-mx', 'Mexican Spanish'),
 ('es-ni', 'Nicaraguan Spanish'),
 ('es-ve', 'Venezuelan Spanish'),
 ('et', 'Estonian'),
 ('eu', 'Basque'),
 ('fa', 'Persian'),
 ('fi', 'Finnish'),
 ('fr', 'French'),
 ('fy', 'Frisian'),
 ('ga', 'Irish'),
 ('gd', 'Scottish Gaelic'),
 ('gl', 'Galician'),
 ('he', 'Hebrew'),
 ('hi', 'Hindi'),
 ('hr', 'Croatian'),
 ('hsb', 'Upper Sorbian'),
 ('hu', 'Hungarian'),
 ('ia', 'Interlingua'),
 ('id', 'Indonesian'),
 ('io', 'Ido'),
 ('is', 'Icelandic'),
 ('it', 'Italian'),
 ('ja', 'Japanese'),
 ('ka', 'Georgian'),
 ('kk', 'Kazakh'),
 ('km', 'Khmer'),
 ('kn', 'Kannada'),
 ('ko', 'Korean'),
 ('lb', 'Luxembourgish'),
 ('lt', 'Lithuanian'),
 ('lv', 'Latvian'),
 ('mk', 'Macedonian'),
 ('ml', 'Malayalam'),
 ('mn', 'Mongolian'),
 ('mr', 'Marathi'),
 ('my', 'Burmese'),
 ('nb', 'Norwegian Bokmål'),
 ('ne', 'Nepali'),
 ('nl', 'Dutch'),
 ('nn', 'Norwegian Nynorsk'),
 ('os', 'Ossetic'),
 ('pa', 'Punjabi'),
 ('pl', 'Polish'),
 ('pt', 'Portuguese'),
 ('pt-br', 'Brazilian Portuguese'),
 ('ro', 'Romanian'),
 ('ru', 'Russian'),
 ('sk', 'Slovak'),
 ('sl', 'Slovenian'),
 ('sq', 'Albanian'),
 ('sr', 'Serbian'),
 ('sr-latn', 'Serbian Latin'),
 ('sv', 'Swedish'),
 ('sw', 'Swahili'),
 ('ta', 'Tamil'),
 ('te', 'Telugu'),
 ('th', 'Thai'),
 ('tr', 'Turkish'),
 ('tt', 'Tatar'),
 ('udm', 'Udmurt'),
 ('uk', 'Ukrainian'),
 ('ur', 'Urdu'),
 ('vi', 'Vietnamese'),
 ('zh-hans', 'Simplified Chinese'),
 ('zh-hant', 'Traditional Chinese')]
LANGUAGES_BIDI    
['he', 'ar', 'fa', 'ur']
LANGUAGE_CODE    
'en-us'
LANGUAGE_COOKIE_AGE    
None
LANGUAGE_COOKIE_DOMAIN    
None
LANGUAGE_COOKIE_NAME    
'django_language'
LANGUAGE_COOKIE_PATH    
'/'
LOCALE_PATHS    
[]
LOGGING    
{}
LOGGING_CONFIG    
'logging.config.dictConfig'
LOGIN_REDIRECT_URL    
'/accounts/profile/'
LOGIN_URL    
'/accounts/login/'
LOGOUT_REDIRECT_URL    
None
MANAGERS    
[]
MEDIA_ROOT    
''
MEDIA_URL    
''
MESSAGE_STORAGE    
'django.contrib.messages.storage.fallback.FallbackStorage'
MIDDLEWARE    
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']
MIDDLEWARE_CLASSES    
['django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware']
MIGRATION_MODULES    
{}
MONTH_DAY_FORMAT    
'F j'
NUMBER_GROUPING    
0
PASSWORD_HASHERS    
'********************'
PASSWORD_RESET_TIMEOUT_DAYS    
'********************'
PREPEND_WWW    
False
ROOT_URLCONF    
'Django02.urls'
SECRET_KEY    
'********************'
SECURE_BROWSER_XSS_FILTER    
False
SECURE_CONTENT_TYPE_NOSNIFF    
False
SECURE_HSTS_INCLUDE_SUBDOMAINS    
False
SECURE_HSTS_PRELOAD    
False
SECURE_HSTS_SECONDS    
0
SECURE_PROXY_SSL_HEADER    
None
SECURE_REDIRECT_EXEMPT    
[]
SECURE_SSL_HOST    
None
SECURE_SSL_REDIRECT    
False
SERVER_EMAIL    
'root@localhost'
SESSION_CACHE_ALIAS    
'default'
SESSION_COOKIE_AGE    
1209600
SESSION_COOKIE_DOMAIN    
None
SESSION_COOKIE_HTTPONLY    
True
SESSION_COOKIE_NAME    
'sessionid'
SESSION_COOKIE_PATH    
'/'
SESSION_COOKIE_SECURE    
False
SESSION_ENGINE    
'django.contrib.sessions.backends.db'
SESSION_EXPIRE_AT_BROWSER_CLOSE    
False
SESSION_FILE_PATH    
None
SESSION_SAVE_EVERY_REQUEST    
False
SESSION_SERIALIZER    
'django.contrib.sessions.serializers.JSONSerializer'
SETTINGS_MODULE    
'Django02.settings'
SHORT_DATETIME_FORMAT    
'm/d/Y P'
SHORT_DATE_FORMAT    
'm/d/Y'
SIGNING_BACKEND    
'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS    
[]
STATICFILES_DIRS    
['C:\\mcw\\Django02\\static1',
 'C:\\mcw\\Django02\\static',
 'C:\\mcw\\Django02\\static2']
STATICFILES_FINDERS    
['django.contrib.staticfiles.finders.FileSystemFinder',
 'django.contrib.staticfiles.finders.AppDirectoriesFinder']
STATICFILES_STORAGE    
'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT    
None
STATIC_URL    
'/static/'
TEMPLATES    
[{'APP_DIRS': True,
  'BACKEND': 'django.template.backends.django.DjangoTemplates',
  'DIRS': ['C:\\mcw\\Django02\\templates'],
  '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']}}]
TEST_NON_SERIALIZED_APPS    
[]
TEST_RUNNER    
'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR    
','
TIME_FORMAT    
'P'
TIME_INPUT_FORMATS    
['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE    
'UTC'
USE_ETAGS    
False
USE_I18N    
True
USE_L10N    
True
USE_THOUSAND_SEPARATOR    
False
USE_TZ    
True
USE_X_FORWARDED_HOST    
False
USE_X_FORWARDED_PORT    
False
WSGI_APPLICATION    
'Django02.wsgi.application'
X_FRAME_OPTIONS    
'SAMEORIGIN'
YEAR_MONTH_FORMAT    
'F Y'
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard page generated by the handler for this status code.
网页返回内容

若是判断请求方式是GET,不然打印post的,那么报错:

from  django.shortcuts import render
def login(request):
    if request.method=='get':
        return render(request, 'login.html')
    else:
        print(request.post)
'WSGIRequest' object has no attribute 'post'

将小写改为大小的get就能get出来东西了。

可是有没有判断请求是POST,都是打印请求.POST,这样报错,么有这个属性。 'WSGIRequest' object has no attribute 'post' ,这里写错了,请求.POST写成了请求.post,没有这个属性

改写成大写就是这个报错:

from  django.shortcuts import render
def login(request):
    if request.method=='GET':
        return render(request, 'login.html')
  elif request.method=='POST':
        print(request.POST) #<QueryDict: {'username': ['小马过河'], 'passwd': ['111111'], 'submit': ['']}>,相似字典也能够这样取,这样获取到了post请求的键值对

 没有返回对象:

The view Django02.urls.login didn't return an HttpResponse object. It returned None instead.

下面的登陆逻辑才是符合实际的逻辑:

from  django.shortcuts import render,redirect
def login(request):
    if request.method=='POST':
        username=request.POST['username']
        passwd=request.POST['passwd']
        if username=='小马过河' and passwd=='111111':
            return redirect(request, 'index.html')
    return render(request, 'login.html')

逻辑符合了,登陆知足条件时因为没有或没有找到index.html报错;首先是我redirect写错了,其次是我也没发现啥问题呢。

Reverse for '<WSGIRequest: POST '/login/'>' not found. '<WSGIRequest: POST '/login/'>' is not a valid view function or pattern name.

那么将重定向改为百度网址试试:

def login(request):
    if request.method=='POST':
        username=request.POST['username']
        passwd=request.POST['passwd']
        if username=='小马过河' and passwd=='111111':
            return redirect('www.baidu.com')
    return render(request, 'login.html')

报错缘由是,没有写https://,直接在当前url  login下拼接的。

此次成功跳转到了百度页面,代码以下

def login(request):
    if request.method=='POST':
        username=request.POST['username']
        passwd=request.POST['passwd']
        if username=='小马过河' and passwd=='111111':
            return redirect('https://www.baidu.com')
    return render(request, 'login.html')

代码以下;

def login(request):
    if request.method=='POST':
        username=request.POST['username']
        passwd=request.POST['passwd']
        if username=='小马过河' and passwd=='111111':
            return redirect('/index/')
    return render(request, 'login.html')
def index(request):
    return render(request,'index.html')
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', login),
]

知足条件,重定向到index,重定向写的是外部url或者是本身项目的urlpatterns中路由的字符串,这里index没有在路由中定义,因此找不到本地的页面;若是是外界的连接地址,redirect方法以后它会直接跳转

302从login跳转到别处的实现

 定位到index,重定向彷佛就是服务器返回一个location,而后浏览器根据location再次get请求这个地址的函数

 

 

 

3.app

将函数写在url里面,函数愈来愈多,须要将函数分开在不一样的目录,这就须要建立app。

建立APP

  3.1命令行

python manage.py startapp app名称  #而后生成app目录

  3.二、pycharm工具

tools ——》 run manage.py task ——》 startapp app名称

 

因为app注册了两遍,因此这里点击报错了。

 直接startapp app名称   生成新的app目录

3.三、也能够在建立django项目时建立app。

 

它会自动生成这个app并注册app

 

 

注册APP

```python
INSTALLED_APPS = [
...
'app01',
'app01.apps.App01Config', # 推荐写法
]
```

setting中安装apps,Apps01Config是个类

将以前在url.py中写的函数放到新建的app01中的views.py中,而且将这个模块导入url.py文件。这样就能够在app中写函数,在url.py中使用函数了。

 

四、ORM

推荐原理学习连接:https://www.cnblogs.com/maple-shaw/p/9323320.html

views.py中的函数判断用户名和密码,是用数据库查询的数据进行判断。所以须要链接数据库查询:

4.一、Django中使用MySQL数据库的流程

1.建立一个MySQL数据库。

 django默认建立的一个数据库,setting中这样配置的。

 

2.在settings中配置,Django链接MySQL数据库:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 引擎
'NAME': 'djangotest', # 数据库名称
'HOST': '127.0.0.1', # ip地址
'PORT':3306, # 端口
'USER':'root', # 用户
'PASSWORD':'123' # 密码

}

 修改引擎为mysql,其它的都加上。这里有数据库的密码,所以项目不能随便就上传到GitHub,这样暴露了数据库,别人能链接数据库作操做的。

修改以后报错:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'.
Did you install mysqlclient or MySQL-python?

mysqldb模块只支持Python2,

 

3.使用pymysql代替MySQLdb;在与settings同级目录下的 init文件中写:

在setting中能够的。

import pymysql
pymysql.install_as_MySQLdb()

 

刚刚导入不了pymysql,查看pycharm的setting中没有这个模块。从新安装了。彷佛不能用我以前想的那个目录的pymysql。

 

4.建立表(在app下的models.py中写类):

from django.db import models
class User(models.Model):
username = models.CharField(max_length=32) # username varchar(32)
password = models.CharField(max_length=32) # username varchar(32)

 

写上用户密码,下载文件,java写的

测试数据库链接成功

 

若是密码错误:

 

 不知为啥,第一次建立表是这样的。

 

 

 

5.执行数据库迁移的命令

python manage.py makemigrations # 检测每一个注册app下的model.py 记录model的变动记录
python manage.py migrate # 同步变动记录到数据库中

 没有注册不能记录变动记录:No changes detected

注册app名字写错了:

"'%s' must supply a name attribute." % entry)
django.core.exceptions.ImproperlyConfigured: 'app01.apps.AppConfig' must supply a name attribute.

 正确注册以后就能够了

 

同步变动记录到数据库中:1处生成的表是app名字_表。2处是jango生成的表,3处能够执行sql语句

 变动记录是收集到下面这里了。

 

 下面表中有操做的记录:

 1处执行成功,2处表中没有数据。缘由:3处settings中没有配置本身想要的mysql数据库。settings不少个配置内容,有s,复数。

 

测试报错之一:

解决方法;

 出现这个报错的缘由其实就是IDEA链接数据库驱动的版本不对,以前的IDEA使用的是5.1.47版本,因此没有问题,2019.1.1版的IDEA默认使用的是8.0.15因此链接不上数据库.只要把版本换回5.1.47便可解决这个问题.打开数据库链接界面,点击下面的MySQL,这个时候在右边就会看到对应的版本,这个时候只须要点击选择须要的版本就能够了.我本地数据库为MySQL5.7,选择5.1.47就能够链接上数据库了.以后点击Apply应用便可. 

 

4.二、添加数据

提交到数据库中:

没有写uri,显示出全部能拼接的匹配路径

url中写了一个路径,views中写了个函数,不须要重启项目,可是配置文件的修改必须重启项目才能生效:

from app01.models import User #或者下
from app01 import models
def orm_test(request):
    #orm操做
    ret=models.User.objects.all()   #经过这个类获取全部数据记录对象
   print(ret,type(ret)) return HttpResponse('ok')

打印结果;  获取到表中全部行,每行都是一个对象,在一个相似列表的数据类型中,

<QuerySet [<User: User object>, <User: User object>]> <class 'django.db.models.query.QuerySet'>

 

4.二、 orm操做

# 获取表中全部的数据
ret = models.User.objects.all() # QuerySet 对象列表 【对象】
# 获取一个对象(有且惟一)
obj = models.User.objects.get(username='alex') # 获取不到或者获取到多个对象会报错
# 获取知足条件的对象
ret = models.User.objects.filter(username='alex1',password='dasb') # QuerySet 对象列表

1)使用orm经过for循环获取数据库中每行记录的各个字段值

 

二、经过orm获取单行数据库的各个字段

 

多个条件匹配数据库某行数据。

from app01 import models
def orm_test(request):
    #orm操做
    obj=models.User.objects.get(username='mcw',password='1')   #经过这个类
    print(obj,type(obj))
    print(obj.username,obj.password)
    return HttpResponse('ok')

当匹配失败时,页面返回错误:

DoesNotExist at /orm_test/

User matching query does not exist.

 当多个条件都匹配成功了:没问题

使用get方法获取到多个知足条件的数据表记录时:

MultipleObjectsReturned at /orm_test/

get() returned more than one User -- it returned 2!
def orm_test(request):
    #orm操做
    obj=models.User.objects.get(username='mcw',password='111')   #经过这个类
    print(obj,type(obj))
    print(obj.username,obj.password)
    return HttpResponse('ok')

get方法获取到或者获取不到都会报错

 

3)fillter过滤一条数据,有几条返回几条,没有匹配到返回空列表对象,前端后端都不报错

def orm_test(request):
    #orm操做
    obj=models.User.objects.filter(username='mcw',password='1111')   #经过这个类
    print(obj,type(obj))
    print(obj.username,obj.password)
    return HttpResponse('ok')

 get改为fillter就报错了。须要再补充

<QuerySet []> <class 'django.db.models.query.QuerySet'>

相关文章
相关标签/搜索